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