为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

幕布斯6054654 2023-04-18 16:38:49
我想删除列表 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 recordslistB = [(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= []
查看完整描述

1 回答

?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

使用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))]


查看完整回答
反对 回复 2023-04-18
  • 1 回答
  • 0 关注
  • 100 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信