处理一些研究数据并尝试找到一种好的 Pythonic 方法来确定一个列表中的值是否位于另一个列表的值之间。每个数据文件的每一行都包含一个连续的年份列表,指示在左侧找到显着值的年份,以及另一个连续的年份列表,指示在右侧找到关联值的年份,并用每年之间的管道字符和空格。
示例:1950 1955 1960 1977|1957 1958 1959 1966 1970 1975 1980 2015
因此,在上面的示例中,1950 年没有平局,但 1955 年与 1957 年、1958 年和 1959 年平局。1960 年与 1966 年和 1970 年平局。1977 年与 1980 年和 2015 年平局。
这些列表是根据不断变化的数据的评估动态创建的,因此在处理此数据时的任何给定迭代中,管道字符左侧或右侧的列表可能有更多或更少的项目。
处理这些列表时,左侧的年份被赋予值 1,但右侧的年份必须根据它们与左侧列表中的年份出现的频率分配一个加权值管道字符的一侧。
分配给右侧绑定(bind)年份的值(value)权重需要以倒数方式递减。例如,1957 年的加权值为 0.5,1958 年的加权值为 0.33,1959 年的加权值为 0.25。然后,下一个绑定(bind)年份范围将大于 1960 年且小于 1977 年,并从 1966 年开始,依次以 0.5 的加权值重新开始。
查看 Stack Overflow 并发现与我想做的类似的东西,但 Python 中没有“Between()”函数:
Finding values in one vector that are between the values in another vector
有没有一种 Pythonic 方法来进行这样的比较,并根据它们在左侧重要年份之间的分布情况,动态地将值分配给右侧的绑定(bind)年份,只需使用 Python 2.7.5,无需额外添加 -在图书馆?
最佳答案
我相信您的问题可以分解为两个步骤:
- 计算左侧每年的范围。
- 计算右侧每年的权重。
Python 的 range
内置和列表/字典理解应该足够了。
下面是一个示例实现。我包含了中间输出,以帮助您了解每个阶段发生的情况。
from itertools import zip_longest
mystr = '1950 1955 1960 1977|1957 1958 1959 1966 1970 1975 1980 2015'
lsts = [list(map(int, x.split())) for x in mystr.split('|')]
# [[1950, 1955, 1960, 1977], [1957, 1958, 1959, 1966, 1970, 1975, 1980, 2015]]
def ranger(x1, x2, lst):
return [i for i in lst if i in range(x1, x2)]
d = {i: ranger(i, j, lsts[1]) for i, j in \
zip_longest(lsts[0], lsts[0][1:], fillvalue=lsts[1][-1]+1)}
# {1950: [], 1955: [1957, 1958, 1959], 1960: [1966, 1970, 1975], 1977: [1980, 2015]}
w = {k: [1/(i+2) for i in range(len(v))] if v else [] for k, v in d.items()}
# {1950: [],
# 1955: [0.5, 0.3333333333333333, 0.25],
# 1960: [0.5, 0.3333333333333333, 0.25],
# 1977: [0.5, 0.3333333333333333]}
关于Python 查找一个列表中介于另一个列表值之间的值的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49215339/