【问题标题】:Python: looking for duplicates in listPython:在列表中查找重复项
【发布时间】:2014-11-15 10:37:01
【问题描述】:

我有一个浮点数列表,我想知道其中有多少重复项。

我试过这个:

p = t_gw.p(sma, m1, m2)       #p is a 1d numpy array
p_list = list(p)
dup = set([x for x in p_list if p_list.count(x) > 1])
print dup

我也尝试过使用 collections.counter,但总是遇到同样的错误

TypeError: unhashable type: 'numpy.ndarray'

我已经查看了类似的问题,但我无法理解 hashable 的含义、为什么列表(或 numpy 数组)不可哈希以及我应该使用哪种类型。

【问题讨论】:

  • 您将一个或多个 numpy 数组包装在一个列表中,然后进行列表理解,然后将剩余的 numpy 数组包装在一个集合中。要包装在一个集合中,您必须具有可散列的项目。 numpy 数组不是。
  • @unixer 不是重复的,这个是 numpy 特有的。

标签: python numpy count hashable


【解决方案1】:

您的 numpy 数组是二维的。所以list(p) 不符合您的期望。请改用list(p.flat)

或者(误)使用numpy的直方图函数:

cnt, bins = numpy.histogram(p, bins=sorted(set(p.flat))+[float('inf')])
dup = bins[cnt>1]

【讨论】:

  • 这很有用!我只有一件事要问:如果p.shape = (1012, 1) 不是一维数组?
  • shape 有两个元素,因此它是二维的。 p.ravel().shape = (1012,) 是一维的。
  • 对不起,但我不知道它们有什么不同:我只能将它们都视为一列的数组(!)
  • 第一种情况,要得到一个元素,你必须写p[i,0],只有一维,p[i]就足够了。
【解决方案2】:

这取决于你所说的重复数是什么意思。

一个简单的方法是使用哈希:

h = {}
arr = [6, 3, 1, 1, 6, 2, 1]
for i in arr:
    if i in h:
        h[i] += 1
    else:
        h[i] =1

print h

现在,如果您的意思是重复值是在列表中多次使用的值,您可以这样做:

num = 0
for i in h:
    if h[i] > 1:
        num += 1

print num

我觉得修改成numpy还是挺简单的。

【讨论】:

    【解决方案3】:

    你想在一个列表中计算一些东西吗? 为什么不用list对象的count方法呢?

    number = my_list.count(my_float)
    

    【讨论】: