почему set не работает с списком

почему set не работает для list

set([[0], [0]])

выкидывает ошибку:

TypeError: unhashable type: 'list'

перевел на русский:

TypeError: нехешируемый тип: 'список' 

понятнее не стало. что означает и как исправить?


Ответы (2 шт):

Автор решения: Zhihar

потому что по каждому элементу множество set вычисляет некоторое число (условно) и ставит в соответствие этому числу элемент множества

простой пример - текст и md5 от текста или crc32 от текста (почитайте про хэш-суммы)

в результате очень быстро можно осуществлять поиск и т.д., то с чем и работает множество как список уникальных элементов

а теперь скажите как именно подсчитать хэш от списка?

поскольку множество этого не умеет, то и соответственно не допускает размещения таких элементов

→ Ссылка
Автор решения: CrazyElf

Если ваши списки не очень длинные, то "исправить" можно, превратив внутренние списки в кортежи - кортежи уже хэшируемы, поскольку они неизменяемые объекты, в отличие от списков:

list_of_lists = [[0], [0], [0, 1, 2], [0, 1], [1, 2], [0, 1, 2]]
print(set(map(tuple, list_of_lists)))

Вывод:

{(0,), (0, 1), (0, 1, 2), (1, 2)}

А также покажу обратное преобразование кортежей в списки, если они вам потом всё-таки понадобятся:

set_of_tuples = set(map(tuple, list_of_lists))
print(list(map(list, set_of_tuples)))

На выходе:

[[0, 1, 2], [0], [0, 1], [1, 2]]
→ Ссылка