Python:列表列表的唯一性

Python:列表列表的唯一性,python,unique,Python,Unique,我很好奇什么是唯一化这些数据对象的有效方法: testdata =[ ['9034968', 'ETH'], ['14160113', 'ETH'], ['9034968', 'ETH'], ['11111', 'NOT'], ['9555269', 'NOT'], ['15724032', 'ETH'], ['15481740', 'ETH'], ['15481757', 'ETH'], ['15481724', 'ETH'], ['10307528', 'ETH'], ['15481757'

我很好奇什么是唯一化这些数据对象的有效方法:

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']
]
对于每个数据对,左边的数字字符串加上右边的类型表示数据元素的唯一性。返回值应该是与testdata相同的列表列表,但只保留唯一值。

您可以使用一组:

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

您还可以看到哪些基准测试包含各种方法,这些方法要么保留顺序,要么不保留顺序。

我尝试了@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

更新

@马克后来改变了他的答案。他目前的答案是使用元组,而且会起作用。我的也是:)

更新2

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

对解决方案进行一点扩展,您也可以只进行一次列表理解和类型转换,以获得所需内容:

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
testdata = list(set(tuple(x) for x in testdata))
此外,如果您不喜欢列表理解,因为许多人觉得它们令人困惑,您可以在for循环中执行相同的操作:

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

如果您有一个对象列表,您可以修改@Mark Byers,请回答:

unique_data = [list(x) for x in set(tuple(x.testList) for x in testdata)]
其中testdata是一个对象列表,其属性为list testList。

请在
numpy
中使用以解决此问题:

import numpy as np

np.unique(np.array(testdata), axis=0)
请注意,需要指定
关键字,否则将首先展平列表

或者,使用:


请注意,使用此方法会丢失订单。如果相关,则您必须在之后对其进行排序或手动删除项目。我收到一个错误:
TypeError:unhabable type:'list'
。Python 2.6.2,UbuntuJaunty。@Hellnar:他刚刚更新了使用元组的代码,现在你不会再遇到这个问题了:)@Manoj Govindan:出现这个问题是因为列表不可散列,只能在一个集合中使用散列类型。我通过转换为元组,然后再转换回列表来修复它。也许OP应该使用元组列表。@Khan:Python集合是无序的。这并不意味着您无法从
列表(某些集合)
获得一致的结果,但这意味着您无法以任何方式设置或影响排序顺序。更多信息:这里有一个小技巧:您可以编写
foo
@Mark:Where
foo
而不是
lambda x:foo(x)
,其中
foo
是可调用的。明白了。另外,集合模块已弃用,请改用内置集合类型。
np.vstack({tuple(row) for row in testdata})