TypeError: unhashable тип: "список" при использовании встроенной функции set
у меня есть список, содержащий несколько списков его элементов
eg: [[1,2,3,4],[4,5,6,7]]
Если я использую встроенную функцию set для удаления дубликатов из этого списка, я получаю ошибку
TypeError: unhashable type: 'list'
код, который я использую-это
TopP = sorted(set(TopP),reverse=True)
где TopP-это список, как, например, выше
это использование set() неправильно? Есть ли другой способ, которым я могу отсортировать список выше?
4 ответов
наборы требуют, чтобы их элементы были hashable. Из типов, определенных в Python только неизменяемые, такие как строки, числа и кортежи, не hashable. Изменяемые типы, такие как списки и dicts, не хэшируются, поскольку изменение их содержимого изменит хэш и нарушит код поиска.
Так как вы сортируете список в любом случае, просто поместите дубликат удаления после список уже отсортирован. Это легко реализовать, не увеличьте алгоритмическую сложность операции и не требуйте изменения подлист на кортежи:
def uniq(lst):
last = object()
for item in lst:
if item == last:
continue
yield item
last = item
def sort_and_deduplicate(l):
return list(uniq(sorted(l, reverse=True)))
наборы удалить повторяющиеся элементы. Чтобы сделать это, элемент не может измениться во время набора. Списки могут изменяться после создания и называются "изменяемыми". Вы не можете поместить изменчивые вещи в набор.
списки есть unmutable эквивалент, называемый 'кортеж'. Вот как вы напишете фрагмент кода, который возьмет список списков, удалит дубликаты списков, а затем отсортирует его в обратном порядке.
result = sorted(set(map(tuple, my_list)), reverse=True)
дополнительное Примечание: Если кортеж содержит список, кортеж по-прежнему считается изменчивым.
примеры:
>>> hash( tuple() )
3527539
>>> hash( dict() )
Traceback (most recent call last):
File "<pyshell#5>", line 1, in <module>
hash( dict() )
TypeError: unhashable type: 'dict'
>>> hash( list() )
Traceback (most recent call last):
File "<pyshell#6>", line 1, in <module>
hash( list() )
TypeError: unhashable type: 'list'
python 3.2
>>>> from itertools import chain
>>>> eg=sorted(list(set(list(chain(*eg)))), reverse=True)
[7, 6, 5, 4, 3, 2, 1]
##### eg contain 2 list within a list. so if you want to use set() function
you should flatten the list like [1, 2, 3, 4, 4, 5, 6, 7]
>>> res= list(chain(*eg)) # [1, 2, 3, 4, 4, 5, 6, 7]
>>> res1= set(res) # [1, 2, 3, 4, 5, 6, 7]
>>> res1= sorted(res1,reverse=True)
определенно не идеальное решение, но мне легче понять, если я преобразую список в кортежи, а затем сортирую его.
mylist = [[1,2,3,4],[4,5,6,7]]
mylist2 = []
for thing in mylist:
thing = tuple(thing)
mylist2.append(thing)
set(mylist2)