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