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

5

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

列表:

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

Would return:

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

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

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

但这只对第一个元素起作用,而不是前两个。不过这正是我想要的。

3个回答

4
如果顺序不重要,您可以使用相同的方法,但将第一个和第二个元素的元组作为键:
{(x[0], x[1]): x for x in L}.values()

如果使用 Python 版本低于 2.7:

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

你可以使用tuple(x[:2])代替(x[0], x[1]),选择更易读的方式。


4

如果顺序很重要,可以使用仅包含嵌套列表前两个元素的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及以上版本中,标准的字典类型也保留了插入顺序:
return list({tuple(x[:2]): x for x in seq}.values())
list()函数的调用是必需的,用于将字典视图对象转换为列表。

我猜如果你_真的_需要它快速运行,这可能是一个不错的解决方案,但在大多数情况下,这只会让代码难以阅读且不符合Python风格。拒绝带有副作用的推导式。 - Aran-Fey
@Aran-Fey:也许是这样,但是这种特定模式曾经是处理这种情况最快的方法。如果你需要性能,实用主义胜过纯粹主义。 - Martijn Pieters

2
这应该可以解决问题:
In [55]: dict((tuple(x[:2]), x) for x in L).values()
Out[55]: [['el1', 'el2', 'value2'], ['el1', 'el5', 'value3'], ['el3', 'el4', 'value2']]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接