Python 从列表中的元组中删除重复项

Python 从列表中的元组中删除重复项,python,list,duplicates,tuples,Python,List,Duplicates,Tuples,我有一个元组列表: lst = [('a','b'), ('c', 'b'), ('a', 'd'), ('e','f'), ('a', 'b')] 我想要以下输出列表: output = [('a','b'), ('e','f')] i、 我想将第一个元组的元素与其余元组进行比较,并删除包含一个或多个重复元素的元组 我的尝试: 我曾考虑使用for循环,但一旦我有了非常大的列表,这就不可行了。我浏览了以下帖子,但未能找到正确的解决方案: 如果有人能指引我正确的方向,那将非常有帮助。谢谢

我有一个元组列表:

lst = [('a','b'), ('c', 'b'), ('a', 'd'), ('e','f'), ('a', 'b')]
我想要以下输出列表:

output = [('a','b'), ('e','f')]
i、 我想将第一个元组的元素与其余元组进行比较,并删除包含一个或多个重复元素的元组

我的尝试:

我曾考虑使用for循环,但一旦我有了非常大的列表,这就不可行了。我浏览了以下帖子,但未能找到正确的解决方案:

如果有人能指引我正确的方向,那将非常有帮助。谢谢

设置应有助于:

>>> s = map(set, lst)
>>> first = s[0]
>>> [first] + [i for i in s if not i & first]
[set(['a', 'b']), set(['e', 'f'])]
或使用
ifilterfalse

>>> from itertools import ifilterfalse
>>> s = map(set, lst)
>>> [first] + list(ifilterfalse(first.intersection, s))
[set(['a', 'b']), set(['e', 'f'])]
假设您希望抑制所有元素的“副本”,而不仅仅是第一个元素,您可以使用:

lst = [('a','b'), ('c', 'b'), ('a', 'd'), ('e','f'), ('a', 'b')]

def merge(x):
    s = set()
    for i in x:
        if not s.intersection(i):
            yield i
            s.update(i)
给予


我真的不理解选择输出所依据的规则。你所需要做的就是实现与整数列表相同的想法,只是更改比较函数。所以你会说
('a','b')
('a','d')
是等价的,因此删除第二个。@millimoose如果元素
a
或元素
b
与前面的元素匹配,然后删除它,那么
('c','b')
('a','b')
的副本,而
('a','d')
的副本('a','b')
。我认为元素上的for循环实际上是您唯一的选择,除非您有关于列表元素的更多信息。@GordonFreeman,这样它们就少了元组,多了字符集?(元组通常被认为是单个值,而不是集合。)非常感谢!这很有效。只是一个简单的问题:如果我使用您的第一个方法,即[i for i in s if not i&first]而不是ifilerfalse,您是否看到任何性能问题(例如:速度)?我的列表很大。谢谢!
>>> list(merge(lst))
[('a', 'b'), ('e', 'f')]
>>> list(merge([('a', 'b'), ('c', 'd'), ('c', 'e')]))
[('a', 'b'), ('c', 'd')]
>>> list(merge([('a', 'b'), ('a', 'c'), ('c', 'd')]))
[('a', 'b'), ('c', 'd')]