Проверено на интерпретаторе Python 2.6:
>>> a=set('abcde')
>>> a
set(['a', 'c', 'b', 'e', 'd'])
>>> l=['f','g']
>>> l
['f', 'g']
>>> a.add(l)
Traceback (most recent call last):
File "<pyshell#35>", line 1, in <module>
a.add(l)
TypeError: list objects are unhashable
Я думаю, что не могу добавить список к набору, потому что Python никак не может сказать, добавил ли я один и тот же список дважды. Есть ли обходной путь?
РЕДАКТИРОВАТЬ: Я хочу добавить сам список, а не его элементы.
Ответы:
Вы не можете добавить список в набор, потому что списки изменчивы, это означает, что вы можете изменить содержимое списка после добавления его в набор.
Однако вы можете добавить кортежи к набору, потому что вы не можете изменить содержимое кортежа:
Редактировать : некоторые пояснения: документация определяет
set
как неупорядоченную коллекцию различных хешируемых объектов. Объекты должны быть хешируемыми, чтобы поиск, добавление и удаление элементов можно было выполнять быстрее, чем просмотр каждого отдельного элемента каждый раз, когда вы выполняете эти операции. Конкретные алгоритмы описаны в статье в Википедии . Алгоритмы хеширования Pythons описаны на effbot.org и__hash__
функции pythons в справочнике по python .Некоторые факты:
list
: используйтеtuple
вместоset
: используйтеfrozenset
вместоdict
: не имеет официального аналога, но есть некоторые рецептыисточник
collections.namedtuple
можно считать «официальным» аналогомdict
.использование
set.update()
или|=
редактировать: если вы хотите добавить сам список, а не его членов, то, к сожалению, вы должны использовать кортеж. Набор участников должен быть хэшируемым .
источник
|
оператор реализует операцию объединения множеств . И|=
оператор, иset.update()
метод применяют эту операцию на месте и фактически являются синонимами. Таким образом,set_a |= set_b
можно считать синтаксический сахар для обоихset_a.update(set_b)
иset_a = set_a | set_b
(за исключением того, что в последнем случае один и тот жеset_a
объект используется повторно, а не переназначается).</ahem>
Чтобы добавить элементы списка в набор , используйте
update
С https://docs.python.org/2/library/sets.html
Например
Если вместо этого вы хотите добавить весь список как один элемент в набор, вы не сможете этого сделать, потому что списки не могут быть хешируемыми. Вместо этого вы можете добавить кортеж, например
s.add(tuple(l))
. Смотрите также TypeError: unhashable type: 'list' при использовании встроенной функции set для получения дополнительной информации об этом.источник
Надеюсь, это поможет:
источник
Пожалуйста, обратите внимание на функцию
set.update()
. Документация гласит:источник
Список объектов не подлежит изменению . Вы могли бы хотеть превратить их в кортежи все же.
источник
Наборы не могут иметь изменяемые (изменяемые) элементы / элементы. Список, будучи изменяемым, не может быть членом набора.
Поскольку наборы изменчивы, вы не можете иметь наборы! Вы можете иметь набор Frozensets, хотя.
(То же самое «требование изменчивости» применяется к ключам dict.)
Другие ответы уже дали вам код, надеюсь, это даст немного понимания. Я надеюсь, что Алекс Мартелли ответит еще более подробно.
источник
Вы хотите добавить кортеж, а не список:
Если у вас есть список, вы можете преобразовать его в кортеж, как показано выше. Кортеж неизменен, поэтому его можно добавить в набор.
источник
Я обнаружил, что мне нужно сделать что-то подобное сегодня. Алгоритм знал, когда он создает новый список, который необходимо добавить в набор, но не когда он закончил работу со списком.
Во всяком случае, поведение, которое я хотел, было для использования,
id
а не дляhash
. Таким образом, я нашелmydict[id(mylist)] = mylist
вместо того,myset.add(mylist)
чтобы предлагать поведение, которое я хотел.источник
Вы захотите использовать кортежи, которые можно хэшировать (вы не можете хэшировать изменяемый объект, например список).
источник
Вот как я обычно это делаю:
источник
Это должно сделать:
источник