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

标签 python for-loop tuples subset data-transform

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

这通常是一件微不足道的事情,但我在列表 A 中有 1000 万条记录,在列表 B 中有 200K 条记录。我当前的脚本(见下文)非常慢(每次扫描列表 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= []

最佳答案

使用itertools.combinationsfrozenset:

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

关于python - 快速删除包含其他列表元组的元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63209874/

相关文章:

python - Python 如何使用 Gunicorn 和 Kubernetes 进行扩展?

python - pandas:使用for循环执行多个命令

scala - 一种更好的模式匹配树状选项结构的实现

swift - Swift 中的元组和函数参数

python - 抓取网页 <ul> <li>(Python)

python - 将新的键/值对添加到 Spark MapType 列

C++ If 在 for 循环中循环。限制

python - `namedtuple` 在内存使用上真的和元组一样高效吗?我的测试说不

python - 如何避免 matplotlib.pyplot 中的线条颜色重复?

javascript - 即使我使用 Number() 函数,数组的最后一个元素始终为 NaN