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

时间:2013-02-05 00:18:58

标签: python list duplicates tuples

我有一个元组列表:

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

我想要以下输出列表:

output = [('a','b'), ('e','f')]

即我想比较第一个元组的元素和剩余的元组,并删除包含一个或多个重复元素的元组。

我的尝试:

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

Removing duplicates members from a list of tuples How do you remove duplicates from a list in whilst preserving order?

如果有人可以指导我正确的方向,那将会非常有帮助。谢谢!

2 个答案:

答案 0 :(得分:6)

假设您想要抑制所有元素的“重复”,而不仅仅是第一个元素,您可以使用:

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)

给出

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

答案 1 :(得分:4)

设置应该有帮助:

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