Редактировать: возможный дубликат. Только после публикации этого вопроса и просмотра «связанных вопросов» я смог найти Почему методы set, такие как .intersection(), не поддерживаются для объектов, подобных set?, этот вопрос может достаточно похоже, чтобы быть дубликатом.
Я пытаюсь увидеть, являются ли ключи из словаря подмножеством набора, и столкнулся с некоторым запутанным поведением объекта представления dict_keys
и методов/операторов набора.
Разница между набором и представлением указывает на то, что:
Только представление словаря dict.keys() всегда является набором (поскольку он ведет себя как набор, но с живым представлением словаря)
И https://docs.python.org/3/library/stdtypes.html#dictionary-view-objects указывает, что
Представления ключей похожи на наборы, поскольку их записи уникальны и могут хэшироваться. ... Для представлений, подобных наборам, доступны все операции, определенные для абстрактного базового класса collections.abc.Set (например, ==, ‹ или ^).
и https://docs.python.org/2/library/stdtypes.html#set подразумевает, что операторы (‹=, |, и т. д.) эквивалентны методам .issubset()
, union()
и т. д.
Однако следующий код не отражает эти утверждения:
> dic = {'first': 'a', 'second': 'b'}
> s = {'first', 'second', 'third'}
> dic.keys() <= s
True
> dic.keys().issubset(s)
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-354-fbf8f9744a80> in <module>
----> 1 dic.keys().issubset(s)
AttributeError: 'dict_keys' object has no attribute 'issubset'
Однако s.issuperset(dic.keys())
возвращает True
.
Почему наблюдается различное поведение, когда все указывает на то, что метод .issubset() будет работать?
set
поддерживаетissubset
, когда<=
уже делает то же самое. - person chepner   schedule 25.07.2019