我有一个元组列表:
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?
如果有人可以指导我正确的方向,那将会非常有帮助。谢谢!
答案 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'])]