Я только что наткнулся на кое-что интересное, о чем я думал спросить.
Добавляя словарь в set
, я предполагал, что словарь будет добавлен как полный словарь, но это не так. Добавляются только ключи:
dicty = {"Key1": "Val1", "Key2": "Val2"}
setunion = set()
setunion.union(dicty)
=> set(['Key2', 'Key1'])
Когда вы пытаетесь добавить его с помощью set.add()
, вы получаете сообщение об ошибке:
setadd = set()
setadd.add(dicty)
Traceback (most recent call last):
File "python", line 1, in <module>
TypeError: unhashable type: 'dict'
Очевидно, такое поведение сильно отличается от списков:
listy = []
listy.append(dicty)
listy
=> [{'Key2': 'Val2', 'Key1': 'Val1'}]
В документах говорится что наборы представляют собой неупорядоченные наборы объектов hashable, что является намеком на некоторые из вышеперечисленных проблем.
Вопросы
Что тут происходит? Элементы набора должны быть хэшируемыми, так что ясно, что это связано с тем, почему я добавляю ключи в набор только с .union()
, но почему ошибка с .add()
?
Есть ли какая-то причина удобства использования, стоящая за различием в поведении наборов и списков?
Есть ли в Python тип данных (или библиотека), который по существу функционирует как список, но содержит только уникальные элементы?
union
можно было добавлять вещи в наборы?union
означает создание нового набора, добавление элементов аргумента в новый набор. Это какextend
для списков, но не на месте. - person user2357112 supports Monica   schedule 05.12.2015add
для создания нового набора не существует. Мутативный вариантunion
—union_update
. - person user2357112 supports Monica   schedule 05.12.2015