Python:列表列表的唯一性

时间:2010-09-16 07:29:00

标签: python unique

我很好奇这种独特的数据对象是多么有效:

testdata =[ ['9034968', 'ETH'], ['14160113', 'ETH'], ['9034968', 'ETH'], ['11111', 'NOT'], ['9555269', 'NOT'], ['15724032', 'ETH'], ['15481740', 'ETH'], ['15481757', 'ETH'], ['15481724', 'ETH'], ['10307528', 'ETH'], ['15481757', 'ETH'], ['15481724', 'ETH'], ['15481740', 'ETH'], ['15379365', 'ETH'], ['11111', 'NOT'], ['9555269', 'NOT'], ['15379365', 'ETH']
]

对于每个数据对,左侧数字字符串PLUS右侧的类型表示数据元素的唯一性。它返回一个与testdata相同的列表列表,但只存在唯一的。

此致

6 个答案:

答案 0 :(得分:76)

您可以使用一套:

unique_data = [list(x) for x in set(tuple(x) for x in testdata)]

您还可以看到this page对保留或不保留顺序的各种方法进行基准测试。

答案 1 :(得分:8)

我尝试了@Mark的回答并得到了一个错误。将列表和每个元素转换为元组使其工作。不确定这是否是最佳方式。

list(map(list, set(map(lambda i: tuple(i), testdata))))

当然,使用列表推导可以表达同样的事情。

[list(i) for i in set(tuple(i) for i in testdata)]

我使用的是Python 2.6.2。

<强>更新

@Mark后来改变了他的回答。他目前的答案使用元组并且会起作用。我的意思是:)。

更新2

感谢@Mark。我已经改变了我的答案,返回列表而不是元组列表。

答案 2 :(得分:1)

import sets
testdata =[ ['9034968', 'ETH'], ['14160113', 'ETH'], ['9034968', 'ETH'], ['11111', 'NOT'], ['9555269', 'NOT'], ['15724032', 'ETH'], ['15481740', 'ETH'], ['15481757', 'ETH'], ['15481724', 'ETH'], ['10307528', 'ETH'], ['15481757', 'ETH'], ['15481724', 'ETH'], ['15481740', 'ETH'], ['15379365', 'ETH'], ['11111', 'NOT'], ['9555269', 'NOT'], ['15379365', 'ETH']]
conacatData = [x[0] + x[1] for x in testdata]
print conacatData
uniqueSet = sets.Set(conacatData)
uniqueList = [ [t[0:-3], t[-3:]] for t in uniqueSet]
print uniqueList

答案 3 :(得分:0)

@Mark Byers解决方案上稍作扩展,您还可以进行列表理解和类型转换,以获得所需的内容:

testdata = list(set(tuple(x) for x in testdata))

此外,如果您不喜欢列表理解,因为许多人都感到困惑,则可以在for循环中执行相同的操作:

for i, e in enumerate(testdata):
    testdata[i] = tuple(e)
testdata = list(set(testdata))

答案 4 :(得分:0)

如果您有对象列表,则可以将@Mark Byers答案修改为:

unique_data = [list(x) for x in set(tuple(x.testList) for x in testdata)]

其中testdata是对象列表,其中具有testList列表作为属性。

答案 5 :(得分:0)

使用numpy中的unique解决此问题:

import numpy as np

np.unique(np.array(testdata), axis=0)

请注意,需要指定axis关键字,否则列表将首先变平。

或者,使用vstack

np.vstack({tuple(row) for row in testdata})