【问题标题】:Remove tuples with same elements in two lists删除两个列表中具有相同元素的元组
【发布时间】:2023-03-17 03:20:01
【问题描述】:
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']

【问题讨论】:

    标签: python


    【解决方案1】:

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

    我这么说只是因为你说你以前使用过套装但有问题。您可以随时将冻结的集合转回元组。

    【讨论】:

      【解决方案2】:

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

      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
      

      【讨论】:

      • 当 a = ['-a', ('a', 'b'),('-c', 'd'), ('-d', 'c'), ( '-d', 'c')] b = ['-b', ('c', '-d'), ('d', '-c'), ('-d', 'c') ] 它给出 ['-a', ('a', 'b'), ('-c', 'd')] ['-b', ('c', '-d'), ('d ', '-c')]
      • 是的。预计会给出这个。正确的?我以为您想删除两个输入列表中的所有常见元组?不是吗?
      猜你喜欢
      • 1970-01-01
      • 2013-04-12
      • 2021-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-09
      • 2017-05-14
      • 2018-11-27
      相关资源
      最近更新 更多