我有两个非常大的 python 列表,如下所示:
List A: [0,0,0,0,0,0,0,1,1,1,1,2,2,3,3,3,4.........]
List B: [0,0,0,0,0,0,2,2,2,2,3,3,4,4.........]
这些列表包含非常大的数字,但我指定了一个最大值,比如 100,之后我可以丢弃其余的。
现在我需要计算每个值 (0,1,2..100) 的比率:列表 A 中的出现次数/列表 B 中的出现次数。而且由于这个值并不总是可能的,所以我决定仅当每个列表中的值出现次数超过 5 次时才计算此值,如果此条件不成立,则合并先前值的出现次数,如果此条件,将为合并值给出相同的比率是正确的。 例如,对于上面的列表,我想创建一个如下所示的系列:
0 : 7/6=1.166
1 : 9/6 = 1.5
2 : 9/6 = 1.5
3 : 9/6 = 1.5
.
.
.
100 : some_number
最佳答案
您可以使用Counter
来计算出现的次数,并使用takewhile
来满足您在100
时停止的要求。
不要丢弃不在列表 b
中的值,请注意我是如何使用 nan
的。
from collections import Counter
from itertools import takewhile
def get_ratios(a, b, max_=None, min_count=0):
if max_ is not None:
a = takewhile(lambda x: x <= max_, a)
b = takewhile(lambda x: x <= max_, b)
count_a, count_b = Counter(a), Counter(b)
return {k: float('nan') if not count_b[k] else count_a[k] / count_b[k]
for k in set(count_a) | set(count_b)
if count_a[k] >= min_count <= count_b[k]}
例子
a = [1, 1, 1, 2, 3, 101]
b = [1, 1, 2, 2, 4, 101]
print(get_ratios(a, b, max_=100))
输出
{ 1: 1.5,
2: 0.5,
3: nan,
4: 0.0 }
要忽略一些表示不足的值,您可以将 min_count
设置为 5
,如您的问题中所述。
请注意,我没有用先前值的比率填充空槽。除非您有非常具体的用例需要它,否则我建议您不要这样做,因为这会将实际 数据与推断 数据混合。找不到的时候还是默认之前的值比较好,但是不要污染实际的数据。
关于python - 有效地计算大型 python 列表中的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52203775/