快速删除包含其他列表元组的元组

我想删除列表 A 中包含列表 B 中的元组的所有元组。


这通常是一件小事,但我在列表 A 中有 1000 万条记录,在列表 B 中有 20 万条记录。我当前的脚本(见下文)非常慢(每次扫描列表 A 约 10 秒)。


例子:


# Input:

listA = [(1,2,3,4,5),(1,2,4,5,6),(1,2,3,7,55),(8,21,22,24,37),...]  # 10 million records

listB = [(1,2,4),(1,4,6),(21,24,37),...]  # 200K records


# Desired Output (filtered listA):

listA = [(1,2,3,7,55),...]

当前运行缓慢的脚本:


listA=[(1,2,3,4,5),(1,2,4,5,6),(1,2,3,7,55),(8,21,22,24,37)]

listB=[(1,2,4),(1,4,6),(21,24,37)]

listATemp=[]


for b in listB:

  for a in listA:

    if not set(b).issubset(a) :

      listATemp.append(a)

  listA= listATemp

  listATemp= []


幕布斯6054654
浏览 101回答 1
1回答

扬帆大鱼

使用itertools.combinations和frozenset:setB = set(map(frozenset, listB))n = len(listB[0])listA = [a for a in listA if not any(frozenset(c) in setB for c in combinations(a, n))]或者假设每个元组都已排序(如果没有,您当然可以先对它们进行排序):setB = set(listB)n = len(listB[0])listA = [a for a in listA if setB.isdisjoint(combinations(a, n))]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python