我有兩個元組列表:第一個(A)有我正在檢查的值集。第二(B)有,我想淘汰,如果他們出現在A.Python - 檢查元組列表中項目的組合
A = [(1, 2, 3), (6, 10, 8)]
B = [(5, 7, 9), (10, 6)]
正如你所看到的,檢查由事實複雜化值的組合是: 期B - 元組可能比A元組短 - B元組的長度可能不同 - B元組中的值可能以不同的順序出現,而不是A元組中的元素 - A元組的長度都相同,但長度可以「 t是預定的
我想出這樣做的最佳方式涉及一些冗餘:
bad_tuples = [tup for badtup in B for tup in A
if [baditem for baditem in badtup if baditem in tup]
and len([baditem for baditem in badtup if baditem in tup]) == len(badtup)]
good_tuples = [tup for tup in A if tup not in bad_tuples]
我認爲這可以完成工作,但我不喜歡這樣一個事實,即我必須在找到bad_tuples時重複相同的列表理解。我也覺得很難閱讀,所以很容易出錯。那麼任何人都可以想到一個更加優雅/高效的完成任務的方式嗎?
(如果它的事項,在我的應用程序也有可能是在一個許多(但< 100)元組和B中只有少數(< 10)元組)
每個元組中的條目是唯一的嗎?將它們轉換爲集合可以簡化這一點,但顯然只有當條目在每個元組中都是唯一的時纔有效。 – richsilv
單個項目可以出現在多個元組中,但每個組合(每個元組的值)在每個列表中都是唯一的。列表A是itertools.product()的結果,具有作爲參數提供的不確定數目的列表。但是有可能相同的項目可能出現在多個輸入列表中,在這種情況下,某些元組可能具有多個具有相同值的項目。 (這是一個足夠複雜的答案?) – monotasker
謝謝,在這個基礎上是元組'(1,2)'不同於'(1,1,2)'?即'1'在'(1,1,2)'兩次的事實是否意味着即使'(1,2)'在B中你也不想從A中排除它? – richsilv