消除列表的重复(Python)

时间:2013-11-20 00:10:06

标签: python list duplicate-removal

我有一个列表列表,需要删除所有具有相同第三元素的列表,并保存1。

例如:

x=[[1,2,3],[1,3,3],[5,6,3],[2,4,6],[8,5,9],[10,5,9]]

可能变成:

x=[[1,2,3],[2,4,6],[8,5,9]]

我尝试过使用lambda消除所有具有相同第二个索引的列表的解决方案,但我不知道如何保存每个元素之一,如set(),我只是得到:

x=[[2,4,6]]

6 个答案:

答案 0 :(得分:8)

Python集应该仍适合你:

>>> seen = set()
>>> result = []
>>> for s in x:
    e = s[2]
    if e not in seen:
        result.append(s)
        seen.add(e)


>>> result
[[1, 2, 3], [2, 4, 6], [8, 5, 9]]

答案 1 :(得分:4)

你也可以在这里使用dict,以后可能会更灵活一些:

data =[[1,2,3],[1,3,3],[5,6,3],[2,4,6],[8,5,9],[10,5,9]]
one_of = {el[2]:el for el in data}.values()
# [[10, 5, 9], [5, 6, 3], [2, 4, 6]]

答案 2 :(得分:3)

如果您定义了辅助类

,则可以使用set
>>> L = [[1,2,3],[1,3,3],[5,6,3],[2,4,6],[8,5,9],[10,5,9]]
>>> class Element(list):__hash__=lambda s:hash(s[2]);__eq__=lambda s,o:s[2]==o[2]
... 
>>> set(map(Element, L))
set([[8, 5, 9], [1, 2, 3], [2, 4, 6]])

答案 3 :(得分:2)

你可以使用list comprehension和helper set来完成这个:

>>> t = set()
>>> y = [l for l in x if l[2] not in t and not t.add(l[2])]
>>> y
[[1, 2, 3], [2, 4, 6], [8, 5, 9]]

答案 4 :(得分:2)

itertools文档带有一组很好的recipes,其中一个,unique_everseen完全符合您的要求:“列出唯一的元素,保留顺序。记住所见过的所有元素。“

您可以将其从配方中复制粘贴,也可以pip install more-itertools将其用作more_itertools.unique_everseen

或者您可以查看代码,看看它实际上只是一个稍微更灵活,略微优化的版本,正是Raymond Hettinger的回答。*

这正是食谱所针对的 - 当你想要对一个可迭代的东西做什么时,通常会有一个食谱,这不仅可以满足您的需求,而且非常简单,如果您需要几分钟时间弄清楚它是如何工作的,你将会知道将来如何自己做。


*这不应该让任何对Python有所了解的人感到惊讶,或只是看the sourceitertools ......

答案 5 :(得分:1)

>>> L = [[1,2,3],[1,3,3],[5,6,3],[2,4,6],[8,5,9],[10,5,9]]
>>> s = set(i[2] for i in L) 
>>> [s.remove(i[2]) or i for i in L if i[2] in s]
[[1, 2, 3], [2, 4, 6], [8, 5, 9]]