列表的独特性如何实现

97 投票
7 回答
103791 浏览
提问于 2025-04-16 04:13

我很好奇,有什么高效的方法可以让这些数据对象变得唯一:

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']
]

对于每一对数据,左边的数字字符串加上右边的类型可以确定这个数据元素的唯一性。返回的结果应该是一个列表,和测试数据的格式一样,但只保留唯一的值。

7 个回答

6

使用 unique 函数可以在 numpy 中解决这个问题:

import numpy as np

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

注意,必须指定 axis 这个参数,否则列表会先被压平。

另外,你也可以使用 vstack

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

我试了@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。我已经把我的答案改成返回一个列表的列表,而不是一个元组的列表。

169

你可以使用一个集合(set):

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

你还可以查看这个页面,它对多种方法进行了性能测试,这些方法有的能保持顺序,有的则不能。

撰写回答