2010-09-16 45 views
23

我很好奇,什么是uniquefying这样的数据对象的EFFIENT方式:的Python:惟一列出的名单

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相同的列表列表,但只有唯一的列表存在。

问候

回答

51

您可以使用一组:

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

你还可以看到this page该基准测试多种,要么保留或不保留顺序的方法。

+0

请注意,您将失去使用此方法的顺序。如果它比您需要对其进行排序或手动删除项目相关。 – Wolph 2010-09-16 07:31:08

+1

我收到一个错误:'TypeError:unhashable type:'list''。 Python 2.6.2,Ubuntu Jaunty。 – 2010-09-16 07:31:30

+0

@Hellnar:他只是更新了代码以使用元组,现在你不会再遇到这个问题:) – Wolph 2010-09-16 07:32:36

5

我试了@马克的答案,并得到一个错误。将列表和每个元素转换为元组使其工作。不知道这是否是最好的方式。

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

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

+0

@Mark:完成。谢谢! – 2010-09-16 07:39:54

+0

这里有一个小技巧:不是'lambda x:foo(x)',你可以写'foo'。 – 2010-09-16 07:49:14

+0

@Mark:其中'foo'是可调用的。疑难杂症。 – 2010-09-16 08:20:10

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 
+0

其他答复是更酷的! – pyfunc 2010-09-16 07:45:05

+2

此外,sets模块已弃用,请改为使用内置set-type。 – 2010-09-16 08:36:11