2

编辑:可能重复。只有在发布此问题并查看“相关问题”之后,我才能找到为什么在类似集合的对象上不支持像 .intersection() 这样的集合方法?,这个问题可能足够相似,可以重复。

我试图查看字典中的键是否是集合的子集,并且遇到了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() 方法可以工作时,为什么会出现分散行为?

4

1 回答 1

0

作为对为什么在类似集合的对象上不支持像 .intersection() 这样的集合方法的回答?指出,

dict 视图只保证 collections.abc.Set 的 API,不等同于 set 本身(...)这些 set-like 对象并不声称匹配 set,甚至是 freezeset,只是 collections.abc.Set(和) collections.abc.Set 除了 isdisjoint (没有等效的运算符)之外不需要任何命名方法。

于 2019-07-25T18:44:13.343 回答