有效地计算大型python列表中的项目

Tri*_*ple 5 python algorithm list pandas

我有两个非常大的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.........]
Run Code Online (Sandbox Code Playgroud)

这些列表会继续使用非常大的数字,但是我指定了一个最大值,比如100,之后我可以丢弃其余的.

现在我需要为每个值(0,1,2 ... 100)计算比率:列表A中的出现次数/列表B中的出现次数.并且因为这个值并不总是可能的,所以我决定只在超过每个列表中出现5次值,如果此条件不为真,则组合前一个值的出现次数,如果此条件正确,将为组合值给出相同的比率.例如,对于上面的列表,我想创建一个如下所示的Series:

0 : 7/6=1.166 
1 : 9/6 = 1.5
2 : 9/6 = 1.5
3 : 9/6 = 1.5
.
.
.
100 : some_number
Run Code Online (Sandbox Code Playgroud)

Oli*_*çon 6

您可以使用a 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]}
Run Code Online (Sandbox Code Playgroud)

例

a = [1, 1, 1, 2, 3, 101]
b = [1, 1, 2, 2, 4, 101]

print(get_ratios(a, b, max_=100))
Run Code Online (Sandbox Code Playgroud)

产量

{ 1: 1.5,
  2: 0.5,
  3: nan,
  4: 0.0 }
Run Code Online (Sandbox Code Playgroud)

要忽略一些代表下的值,你可以设置min_count到5作为mentionned你的问题.

请注意,我没有用前一个值的比例填充空槽.除非你有一个非常具体的用例需要它,我建议你不要这样做,因为这会将实际数据与外推数据混合在一起.最好在找不到前一个值时默认,但不污染实际数据.