簡體   English   中英

刪除兩個列表中具有相同元素的元組

[英]Remove tuples with same elements in two lists

a=['-a', ('-c', 'd'), ('-d', 'c')]
b=['-b', ('c', '-d'), ('d', '-c')]

基本上,對於每個列表,如果另一個列表中有一些元組與它具有相同的元素,則從兩個列表中刪除所有具有此元素的元組。

(我使用的是集合而不是元組,但是在我的代碼中的某個地方出錯了
說:不可散列的類型:'set',所以我把它改成了元組......)

res=[]
for i in a:
    for j in b:
        if type(i) == tuple and type(j) == tuple:
            if i[0] in j and i[1] in j:
                res.append(i)
                res.append(j)
a,b=list(set(a)-set(res)),list(set(b)-set(res))
print(a,b)

這給出a=['a'],b=['-b'] ,是否有更好的方法(可能是一些簡單的內置函數)來做同樣的事情?


更多示例

>>>a=['-a', ('-c', 'd'), ('-d', 'c'), ('-d', 'c')]
>>>b=['-b', ('c', '-d'), ('d', '-c'), ('-d', 'c')]

>a=['a'],b=['-b']

>>>a=['-a', ('a', 'b'),('-c', 'd'), ('-d', 'c'), ('-d', 'c')]
>>>b=['-b', ('c', '-d'), ('d', '-c'), ('-d', 'c')]

>a=['a',('a', 'b')],b=['-b']

使用frozenset在子項目上,您將能夠使用set.difference

a = ['-a', ('a', 'b'),('-c', 'd'), ('-d', 'c'), ('-d', 'c')]
b = ['-b', ('c', '-d'), ('d', '-c'), ('-d', 'c')]

seta = {frozenset(i) if isinstance(i, tuple) else i for i in a}
setb = {frozenset(i) if isinstance(i, tuple) else i for i in b}
print(seta - setb, setb - seta)

印刷:

{'-a', frozenset({'a', 'b'})} {'-b'}

我之所以這么說,是因為您說您以前使用過套裝但有問題。 您始終可以將凍結的集合轉回元組。

請找到以下答案。 基本上,您只需要先找出重復項。

a = ['-a', ('-c', 'd'), ('-d', 'c')]
b = ['-b', ('-c', 'd'), ('d', '-c')]

to_remove = set(a).intersection(set(b))
a = [i for i in a if i not in to_remove or type(i) != tuple]
b = [j for j in b if j not in to_remove or type(j) != tuple]

print a, b

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM