无论顺序如何,都可以在python列表中获取唯一的元组

don*_*lan 10 python numpy list duplicates

我有一个python列表:

[ (2,2),(2,3),(1,4),(2,2), etc...]
Run Code Online (Sandbox Code Playgroud)

我需要的是某种功能,将其减少为其独特的组件......在上面的列表中:

[ (2,2),(2,3),(1,4) ]
Run Code Online (Sandbox Code Playgroud)

numpy unique并不是这么做的.我可以想办法做到这一点 - 将我的元组转换为数字,[22,23,14,etc.]找到唯一的,并从那里开始工作......但我不知道复杂性是否会失控.是否有一个函数可以完成我尝试用元组做的事情?


以下是演示此问题的代码示例:

 import numpy as np

 x = [(2,2),(2,2),(2,3)]
 y = np.unique(x)
Run Code Online (Sandbox Code Playgroud)

回报:y:[2 3]

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

 x = [(2,2),(2,2),(2,3)]
 y = list(set(x))
Run Code Online (Sandbox Code Playgroud)

返回y:[(2,2),(2,3)]

tim*_*geb 23

如果订单无关紧要

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

>>> l = [(2,2),(2,3),(1,4),(2,2)]
>>> list(set(l))
[(2, 3), (1, 4), (2, 2)]
Run Code Online (Sandbox Code Playgroud)

如果订单很重要

(UPDATE)

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

>>> l = [(2,2),(2,3),(1,4),(2,2)]
>>> list(dict.fromkeys(l))
[(2, 2), (2, 3), (1, 4)]
Run Code Online (Sandbox Code Playgroud)

(老答复)

如果顺序很重要,过滤重复项的规范方法是:

>>> 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)]
Run Code Online (Sandbox Code Playgroud)

最后,慢一点,多一点hackish,你可以滥用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)]
Run Code Online (Sandbox Code Playgroud)


Mur*_*nik 8

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

>>> list(set([ (2,2),(2,3),(1,4),(2,2) ]))
[(2, 3), (1, 4), (2, 2)]
Run Code Online (Sandbox Code Playgroud)


Meh*_*ari 7

你可以简单地做

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

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

  • 很好的解决方案,可以使用列表理解使其更短: [tuple(i) for i in np.unique(x, axis=0)] (2认同)

zon*_*ndo 5

set() 将删除所有重复项,然后您可以将其放回列表中:

unique = list(set(mylist))
Run Code Online (Sandbox Code Playgroud)

set()但是,使用会杀死您的订单。如果顺序很重要,您可以使用列表推导来检查该值是否已存在于列表的较早位置:

unique = [v for i,v in enumerate(mylist) if v not in mylist[:i]]
Run Code Online (Sandbox Code Playgroud)

但是,该解决方案有点慢,因此您可以这样做:

unique = []
for tup in mylist:
    if tup not in unique:
        unique.append(tup)
Run Code Online (Sandbox Code Playgroud)

  • 是的,存储在集合中看到的内容:) - 区别在于该集合具有 O(1) 成员资格测试。 (2认同)