Преобразование списка / набора идет не так, почему?

#python

#python

Вопрос:

Этот код:

 testset = list(set(child).union(pot_deck))
  

раньше работало, создавая testset список, представляющий собой объединение двух списков child и pot_deck . Я изменил что-то, казалось бы, не связанное в коде, и теперь это выходит с
TypeError: unhashable type: 'list' .

Я пытался

 testset = list(set(child).union(set(pot_deck)))
  

тоже, но с тем же результатом.

Комментарии:

1. содержит ли в них списки child или pot_deck ? обычно ошибка unhashable возникает, когда вы пытаетесь указать, что элемент набора недопустим для помещения в set.

2. Выведите child и pot_deck . Похоже, что по крайней мере у одного из них есть список в качестве элемента.

3. Спасибо. Вы оба правы. Каким-то образом это стало списком по пути. Мне нужно еще немного поработать над кодом.

Ответ №1:

Убедитесь, что ни в одном из списков, которые вы хотите преобразовать в набор, нет списка. Списки не являются хэшируемыми и, следовательно, не могут быть элементом набора.

Ответ №2:

Списки с простыми примитивными значениями должны быть хэшируемыми, по крайней мере, в Python 3.8 :

 In [5]: child = [1]

In [6]: pot_deck = [2]

In [7]: testset = list(set(child).union(pot_deck))
   ...:

In [8]: testset
Out[8]: [1, 2]
  

Однако, если у вас есть список списков, вы получите:

 In [9]: child = [[1]]

In [10]: testset = list(set(child).union(pot_deck))
    ...:
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-10-52828817787d> in <module>
----> 1 testset = list(set(child).union(pot_deck))

TypeError: unhashable type: 'list'
  

Итак, я предполагаю, что это то, что произошло. Вы можете распечатать содержимое в child и post_deck и узнать.