在大型python列表中有效计数项目

时间:2018-09-06 12:08:01

标签: python algorithm pandas list

我有两个非常大的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

1 个答案:

答案 0 :(得分:6)

您可以使用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

请注意,我没有使用上一个值的比率来填充空白位置。除非您有一个非常特殊的用例需要它,否则我建议您不要这样做,因为这样会将实际数据与外推数据混合在一起。最好在找不到前一个值时将其默认为默认值,但不要污染实际数据。