列表列表中元素的出现

occurence of an element in a list of lists

假设我有一个列表

 record = [['g1','g2','g3'],['g2','g4'],['g1','g3','g5'],['g2','g3','g5'],['g1','g4']]

我有元组列表

list1 = [('g1','g2'),('g1','g3'),('g1','g4'),('g1','g5'),('g2','g3'),('g2','g4'),('g2','g5'),('g3','g4'),('g3','g5'),('g4','g5')]

现在有多少次 ('g1','g2') 出现在记录中? 解决方案应为 1,因为 ('g1','g2') 仅存在于 ['g1','g2','g3']

我可以将元组列表更改为列表列表。有没有简单的方法而不是蛮力?因为我的列表列表可能包含 1000k 个项目

它不漂亮,但它有效:

record = [['g1','g2','g3'],['g2','g4'],['g1','g3','g5'],['g2','g3','g5'],['g1','g4']]
pattern = [('g1','g2'),('g1','g3'),('g1','g4'),('g1','g5'),('g2','g3'),('g2','g4'),('g2','g5'),('g3','g4'),('g3','g5'),('g4','g5')]

res = {}
for p in pattern:
    res[str(p)] = 0
    for r in record:
        if set(p).issubset(set(r)):
            res[str(p)] += 1

print(res)

编辑:
10^6 项? (好吧,那是行不通的……)

将列表列表中的项目 g1, g2, ... 视为无向图的顶点。浏览列表列表并构建图表。每当 g1g2 出现在同一个子列表中时,将 g1 <-> g2 的权重增加 1。那么,你要找的数就是入射在元组元素上的边的权值。

这假设元组总是有两个元素。如果元组的大小是任意的,而且子列表是任意的,那么这个问题就简化为寻找多个子图同构,每个子图同构都是 NP-Complete。看到这个: