我正在尝试从嵌套列表中删除重复项,前提是前两个元素相同,忽略第三个...
列表:
L = [['el1','el2','value1'], ['el3','el4','value2'], ['el1','el2','value2'], ['el1','el5','value3']]
会回来:
L = [['el3','el4','value2'], ['el1','el2','value2'], ['el1','el5','value3']]
我找到了一种类似here的简单方法:
dict((x[0], x) for x in L).values()
但这只适用于第一个元素而不是前两个元素,但这正是我想要的。
答案 0 :(得分:4)
如果顺序无关紧要,您可以使用相同的方法,但使用第一个和第二个元素的元组作为键:
dict(((x[0], x[1]), x) for x in L).values()
或者在Python 2.7及更高版本上:
{(x[0], x[1]): x for x in L}.values()
您可以使用(x[0], x[1])
而不是tuple(x[:2])
,而是使用您认为更具可读性的内容。
答案 1 :(得分:3)
如果订单很重要,请使用仅包含嵌套列表前两个元素的set
:
seen = set()
seen_add = seen.add
return [x for x in seq if tuple(x[:2]) not in seen and not seen_add(tuple(x[:2]))]
或者您可以使用collections.OrderedDict()
对象来保持订单;将x[:2]
切片保留为键(作为元组),并提取值:
from collections import OrderedDict(
return OrderedDict((tuple(x[:2]), x) for x in seq).values()
在Python 3.6及更高版本中,标准的dict类型也会保留插入顺序:
return list({tuple(x[:2]): x for x in seq}.values())
需要list()
调用才能将字典视图对象转换为列表。
答案 2 :(得分:2)
这应该这样做:
In [55]: dict((tuple(x[:2]), x) for x in L).values()
Out[55]: [['el1', 'el2', 'value2'], ['el1', 'el5', 'value3'], ['el3', 'el4', 'value2']]