在python列表中获取唯一元组,而不考虑ord

2024-04-23 15:49:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个python列表:

[ (2,2),(2,3),(1,4),(2,2), etc...]

我需要的是某种函数,把它简化成它独特的组件。。。在上面的列表中:

[ (2,2),(2,3),(1,4) ]

numpy unique并不完全这样做。我能想出一种方法——把我的元组转换成数字,[22,23,14,etc.],找到uniques,然后从那里开始工作……但我不知道复杂性是否不会失控。有没有一个函数能像我对元组所做的那样?


下面是演示该问题的代码示例:

 import numpy as np

 x = [(2,2),(2,2),(2,3)]
 y = np.unique(x)

returns: y: [2 3]

下面是演示修复的解决方案的实现:

 x = [(2,2),(2,2),(2,3)]
 y = list(set(x))

returns y: [(2,2),(2,3)]


Tags: 方法函数代码numpy示例列表npetc
3条回答

如果订单无关紧要

如果结果的顺序不重要,可以将列表转换为集合(因为元组是散列的),并将集合转换回列表:

>>> l = [(2,2),(2,3),(1,4),(2,2)]
>>> list(set(l))
[(2, 3), (1, 4), (2, 2)]

如果订单重要

(更新)

从CPython 3.6(或任何python3.7版本)开始,常规字典都会记住它们的插入顺序,因此您可以简单地发出。

>>> l = [(2,2),(2,3),(1,4),(2,2)]
>>> list(dict.fromkeys(l))
[(2, 2), (2, 3), (1, 4)]

(旧答案)

如果顺序很重要,则筛选重复项的标准方法是:

>>> seen = set()
>>> result = []
>>> for item in l:
...     if item not in seen:
...         seen.add(item)
...         result.append(item)
... 
>>> result
[(2, 2), (2, 3), (1, 4)]

最后,再慢一点,再黑一点,就可以将OrderedDict滥用为有序集:

>>> from collections import OrderedDict
>>> OrderedDict.fromkeys(l).keys() # or list(OrderedDict.fromkeys(l)) if using a version where keys() does not return a list
[(2, 2), (2, 3), (1, 4)]

使用set将删除重复项,然后从中创建list

>>> list(set([ (2,2),(2,3),(1,4),(2,2) ]))
[(2, 3), (1, 4), (2, 2)]

你只需要

y = np.unique(x, axis=0)
z = [] 
for i in y:
   z.append(tuple(i))

原因是元组列表被numpy解释为2D数组。通过设置axis=0,您将要求numpy不要展平数组并返回唯一的行。

相关问题 更多 >