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)