消除列表的重复项(Python)

消除列表的重复项(Python),python,list,duplicate-removal,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]] Python集应该仍然适用于您: >>> seen = set() &

我有一个列表,需要删除所有具有相同第三个元素的列表,并保存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]]

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

可以使用列表理解和帮助器集执行此操作:

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

您也可以在此处使用
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]]

如果定义帮助器类,则可以使用
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]])

itertools
docs附带了一套很好的工具,其中一个,
unique\u everseed
正是您想要的:“列出唯一的元素,保持顺序。记住所有见过的元素。”

你可以从食谱中复制粘贴,也可以将其用作
更多工具。独一无二的\u everseed

或者你可以看看代码,它本质上只是一个稍微灵活一点,稍微优化的版本,雷蒙德·海廷格的答案就是这样的*

这正是食谱的作用,当你想对一个可数物体做些什么的时候,通常会有一个食谱,它不仅能满足你的需要,而且非常简单,如果你花几分钟的时间来研究它是如何工作的,你将来就会知道如何自己去做



*这应该不会让任何了解Python的人感到惊讶,或者只是看看
itertools

请发布您的尝试,这样我们就可以告诉您它的不足之处
[1,3,3]
[5,6,3]
去哪里了?@roippi:大概,因为这两个列表中索引2处的元素都是3,它们消失是因为保留了
[1,2,3]
。不清楚OP是指索引2从0开始计数,还是指第二个元素从1开始计数。@user2357112“第二个元素”是指索引1处的元素。对不起,我是指索引2从0开始计数。我一直收到set()错误,如“Unhable type:list”,不知道您可以将变量定义为这样的空集。泰!呸,有雷蒙德在场是不公平的:)乔恩,我们只会得到最后一个重复的值,但他只想要第一个重复的值。如果你想要第一个值,就把数据倒过来。@thefourtheye。。。第一次出现是一个合理的假设,但是,实际上并没有指定情况:)需要删除所有具有相同第三个元素的列表,然后保存1@RomanPekar:那样的话,我应该给它添加一个链接。(我现在已经做了。)
>>> 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]])