0

我有一个元组列表:

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

我想要以下输出列表:

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

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

我的尝试:

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

从元组列表中删除重复成员 如何在保留顺序的同时从列表中删除重复成员?

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

4

2 回答 2

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')]
于 2013-02-05T00:26:13.240 回答
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'])]
于 2013-02-05T00:25:48.330 回答