基于前2个元素从嵌套列表中删除重复项

时间:2012-10-15 19:50:15

标签: python list

我正在尝试从嵌套列表中删除重复项,前提是前两个元素相同,忽略第三个...

列表:

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()

但这只适用于第一个元素而不是前两个元素,但这正是我想要的。

3 个答案:

答案 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']]