TypeError: unhashable type: 'list' при использовании встроенной функции set
У меня есть список, содержащий несколько списков в качестве его элементов
eg: [[1,2,3,4],[4,5,6,7]]
Если я использую встроенную функцию set для удаления дубликатов из этого списка, я получаю сообщение об ошибке
TypeError: unhashable type: 'list'
Код, который я использую,
TopP = sorted(set(TopP),reverse=True)
Где TopP - это список, аналогичный, например, Выше
Является ли это использование set() неправильным? Есть ли другой способ, которым я могу сортировать вышеуказанный список?
Ответы
Ответ 1
Установки требуют, чтобы их элементы были хешируемыми. Из типов, предопределенных Python, только хешируемые только неизменяемые, такие как строки, числа и кортежи. Переменные типы, такие как списки и 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)))
Ответ 2
Устанавливает удаление повторяющихся элементов. Для этого элемент не может измениться во время установки. Списки могут меняться после их создания и называются "изменчивыми". Вы не можете поместить измененные вещи в набор.
В списках есть unmutable эквивалент, называемый 'tuple'. Вот как вы могли бы написать фрагмент кода, который взял список списков, удалил дубликаты списков, а затем отсортировал их в обратном порядке.
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'
Ответ 3
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)
Ответ 4
Определенно не идеальное решение, но мне легче понять, преобразую ли я список в кортежи, а затем отсортирую его.
mylist = [[1,2,3,4],[4,5,6,7]]
mylist2 = []
for thing in mylist:
thing = tuple(thing)
mylist2.append(thing)
set(mylist2)