查找列表列表中配对出现的比例

问题描述 投票:0回答:1

我有一个数据集,它是 ID 列表的列表。每个列表可以有一个或多个唯一的 ID。

a = [
['123','456','789'],
['123'],
['123','456'],
['456','789']
]

我想计算每对ID的以下值: Value(id1,id2) = 具有 id1,id2 的列表数量 / 具有 id1 或 id2 的列表数量 上面的示例列表 a 的预期结果如下:

Value('123','456') = 0.5
Value('123','789') = 0.25
Value('456','789') = 0.66

我尝试过的方法是制作两个字典 (1) 对每对 ID 进行计数,如本文中的最佳答案所述:在列表列表中查找最频繁出现的对。

(2) 每个 ID 都计数

from collections import Counter from itertools import combinations d = Counter() s = Counter() for lst in a: for id in lst: s[id] += 1 if len(lst) < 2: continue lst.sort() for comb in combinations(lst,2): d[comb] += 1
然后,我创建一个最终字典,在 for 循环中使用两个字典 s 和 d,将上面的 Value 函数应用于每对 ID。

finaldict={k: d[k]/(s[k[0]]+s[k[1]]-d[k]) for k in d.keys()}
这部分花费了很长时间,因为唯一 ID 的数量非常大(大约 100,000),我想知道是否有更快的方法来做到这一点。

python dictionary combinations counter python-itertools
1个回答
0
投票
您可以对任务使用集合运算:

from itertools import combinations a = [["123", "456", "789"], ["123"], ["123", "456"], ["456", "789"]] d = {} for i, l in enumerate(a): for v in l: d.setdefault(v, set()).add(i) for n1, n2 in combinations(d, 2): i = d[n1].intersection(d[n2]) u = d[n1].union(d[n2]) print(n1, n2, len(i) / len(u))
打印:

123 456 0.5 123 789 0.25 456 789 0.6666666666666666
    
© www.soinside.com 2019 - 2024. All rights reserved.