列表列表中元素的出现
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, ...
视为无向图的顶点。浏览列表列表并构建图表。每当 g1
和 g2
出现在同一个子列表中时,将 g1 <-> g2
的权重增加 1
。那么,你要找的数就是入射在元组元素上的边的权值。
这假设元组总是有两个元素。如果元组的大小是任意的,而且子列表是任意的,那么这个问题就简化为寻找多个子图同构,每个子图同构都是 NP-Complete。看到这个:
假设我有一个列表
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, ...
视为无向图的顶点。浏览列表列表并构建图表。每当 g1
和 g2
出现在同一个子列表中时,将 g1 <-> g2
的权重增加 1
。那么,你要找的数就是入射在元组元素上的边的权值。
这假设元组总是有两个元素。如果元组的大小是任意的,而且子列表是任意的,那么这个问题就简化为寻找多个子图同构,每个子图同构都是 NP-Complete。看到这个: