在两个列表中删除具有相同元素的元组

时间:2019-11-14 00:40:16

标签: python

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

基本上,对于每个列表,如果另一个列表中有一些具有相同元素的元组,则从两个列表中删除所有具有此元素的元组。

(我使用的是集合而不是元组,但是我的代码中出现了错误
说:不可散列的类型:“设置”,所以我将其更改为元组...)

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

2 个答案:

答案 0 :(得分:3)

在子项目上使用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'}

我之所以这么说是因为您说您之前使用过集合,但是遇到了问题。您始终可以将冻结的集恢复为元组。

答案 1 :(得分:1)

请找到以下答案。基本上,您只需要先查找重复项即可。

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