我有一个数据集,它是 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),我想知道是否有更快的方法来做到这一点。
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