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)