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.