5

仅当前两个元素相同时,我才尝试从嵌套列表中删除重复项,而忽略第三个。

列表:

L = [['el1','el2','value1'], ['el3','el4','value2'], ['el1','el2','value2'], ['el1','el5','value3']]

将返回:

L = [['el3','el4','value2'], ['el1','el2','value2'], ['el1','el5','value3']]

我在这里找到了一种类似的简单方法:

dict((x[0], x) for x in L).values()

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

4

3 回答 3

4

如果顺序无关紧要,您可以使用相同的方法,但使用第一个和第二个元素的元组作为键:

{(x[0], x[1]): x for x in L}.values()

或者在 2.7 之前的 Python 版本上:

dict(((x[0], x[1]), x) for x in L).values()

而不是(x[0], x[1])你可以使用tuple(x[:2]),使用你觉得更易读的任何一个。

于 2012-10-15T19:52:00.313 回答
4

如果顺序很重要,set请仅将 a 与嵌套列表的前两个元素一起使用:

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()需要调用才能将字典视图对象转换为列表。

于 2012-10-15T19:53:25.053 回答
2

这应该这样做:

In [55]: dict((tuple(x[:2]), x) for x in L).values()
Out[55]: [['el1', 'el2', 'value2'], ['el1', 'el5', 'value3'], ['el3', 'el4', 'value2']]
于 2012-10-15T19:53:11.107 回答