我有一个python列表:
[ (2,2),(2,3),(1,4),(2,2), etc...]
我需要的是某种功能,将其减少为独特的组件......在上面的列表中会是这样的:
[ (2,2),(2,3),(1,4) ]
numpy unique并不是这么做的。我可以想办法做到这一点 - 将我的元组转换为数字,[22,23,14,etc.]
,找到唯一的,并从那里开始工作......但我不知道复杂性是否会从手。是否有一个函数可以完成我尝试用元组做的事情?
以下是演示此问题的代码示例:
import numpy as np
x = [(2,2),(2,2),(2,3)]
y = np.unique(x)
返回:y:[2 3]
以下是演示修复的解决方案的实现:
x = [(2,2),(2,2),(2,3)]
y = list(set(x))
返回y:[(2,2),(2,3)]
答案 0 :(得分:23)
如果订单无关紧要
如果结果的顺序不重要,您可以将列表转换为集合(因为元组是可清除的)并将集合转换回列表:
>>> l = [(2,2),(2,3),(1,4),(2,2)]
>>> list(set(l))
[(2, 3), (1, 4), (2, 2)]
如果订单重要
(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)]
(OLD ANSWER)
如果订单很重要,过滤重复项的规范方法是:
>>> 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)]
最后,慢一点,多一点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)]
答案 1 :(得分:8)
使用set
会删除重复项,之后您会从中创建list
:
>>> list(set([ (2,2),(2,3),(1,4),(2,2) ]))
[(2, 3), (1, 4), (2, 2)]
答案 2 :(得分:6)
您只需做
GET /__cypress/runner/cypress_runner.css 200 70.455 ms - -
GET /__cypress/runner/cypress_runner.js 200 340.370 ms - -
HEAD / 500 54.441 ms - -
HEAD / 500 81.404 ms - -
HEAD / 500 89.034 ms - -
原因是numpy将元组列表解释为2D数组。通过设置axis = 0,您将要求numpy不要展平数组并返回唯一的行。
答案 3 :(得分:3)
set()
将删除所有重复项,然后您可以将其重新列入列表:
unique = list(set(mylist))
然而,使用set()
将会终止您的订购。如果订单很重要,您可以使用列表推导来检查列表中先前是否已存在该值:
unique = [v for i,v in enumerate(mylist) if v not in mylist[:i]]
然而,这个解决方案有点慢,所以你可以这样做:
unique = []
for tup in mylist:
if tup not in unique:
unique.append(tup)