Python: поиск дубликатов в списке

У меня есть список с плавающей точкой, и я хочу знать, сколько в нем дубликатов.

Я пытался с этим:

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

Я также пытался использовать collection.counter, но всегда получаю ту же ошибку

TypeError: unhashable type: 'numpy.ndarray'

Я смотрел вокруг в похожих вопросах, но я не могу понять, что означает hashable, почему список (или пустой массив) не является hashable и какой тип я должен использовать.

3 ответа

Решение

Ваш numpy-массив двумерный. Так list(p) не делает, что вы ожидаете. использование list(p.flat) вместо.

Или (неправильно) используйте функцию гистограммы numpy:

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

Вы хотите посчитать что-то в списке? почему бы не использовать метод count объекта list?

number = my_list.count(my_float)

Это зависит от того, что вы подразумеваете под количеством дубликатов.

Самый простой способ сделать это - использовать хеш:

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.

Другие вопросы по тегам