亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

快速刪除包含其他列表元組的元組

快速刪除包含其他列表元組的元組

幕布斯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 關注
  • 126 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號