К сожалению, в обоих текущих ответах не рассматриваются причины, по которым это делается, но сосредоточиться на том, как это делается.Этот список рассылки обсуждение было удивительно, так что я буду суммировать вещи:
Для odict.keys
/dict.keys
и odict.items
/dict.items
:
odict.keys
(subclass of dict.keys
) поддерживает сравнение из-за его соответствие collections.abc.Set
(это набор подобный объект). Это возможно из-за того, что keys
в словаре (заказанный или нет) гарантированно будет уникальным и хешируемым.
odict.items
(subclass of dict.items
) также поддерживает сравнение по той же причине, что и .keys
. itemsview
позволено сделать это, так как он поднимает соответствующую ошибку, если один из item
с (в частности, второй элемент, представляющий собой значение) не hashable, уникальность гарантируется, хотя (из-за keys
быть уникальным):
>>> od = OrderedDict({'a': []})
>>> set() & od.items()
TypeErrorTraceback (most recent call last)
<ipython-input-41-a5ec053d0eda> in <module>()
----> 1 set() & od.items()
TypeError: unhashable type: 'list'
Для обоих этих видов keys
, items
сравнение использует простую функцию, называемую all_contained_in
(довольно читабельна), которая использует объекты __contain__
метод для проверки принадлежности элементов в рассматриваемых представлениях.
Теперь о odict.values
/dict.values
:
Как заметил, odict.values
(subclass of dict.values
[шокер]) не сравнивать как подобные множества объектов. Это происходит потому, что values
из valuesview
не может быть представлена в виде набора, причины двоякая:
- Самое главное, что точка зрения может содержать дубликаты, которые не могут быть сброшены.
- В представлении могут содержаться объекты, не содержащие хэшируемых объектов (которые сами по себе недостаточны, чтобы не обрабатывать представление как заданное).
Как указано в комментарии по @user2357112 и @abarnett в списке рассылки, odict.values
/dict.values
является мультимножеством, обобщение множеств, позволяет несколько экземпляров из его элементов. Попытка сравнить их не так просто, как сравнение keys
или items
из-за присущего дублирования, упорядочения и того факта, что вам, вероятно, необходимо учитывать ключи, соответствующие этим значениям. Должен dict_values
, которые выглядят так:
>>> {1:1, 2:1, 3:2}.values()
dict_values([1, 1, 2])
>>> {1:1, 2:1, 10:2}.values()
dict_values([1, 1, 2])
фактически равными, даже если значения, соответствующие ключи не то же самое? Может быть? Возможно, нет? Это не прямолинейно в любом случае и приведет к неизбежному путанице.
Дело будет сделано, однако, что это не так просто, чтобы сравнить их как с keys
и items
, чтобы подвести итог, с другой комментарий от @abarnett на the mailing list:
Если вы думая, что мы могли бы определить, какие мультимножества должны делать, несмотря на то, что у них нет стандартного мультимножества или ABC для них, и примените это к значениям представлений, следующий вопрос заключается в том, как сделать это лучше, чем квадратичное время для значений без хэширования. (И вы не можете взять на себя заказ здесь.) Будет ли иметь представление значений висеть в течение 30 секунд, а затем вернуться с ответом, который вы интуитивно хотели, вместо того, чтобы дать неправильный ответ в 20 миллиселей в качестве улучшения? (В любом случае, вы будете изучать один и тот же урок: не сравнить взгляды ценности Я предпочел бы узнать, что в 20 мс с.).
Работает хорошо на Python 2.7.6 –
** 'ДИКТ. values' ** возвращает [** 'ValuesView' **] (https://docs.python.org/3/glossary.html#term-dictionary-view) –