字典视图对象与集合
Posted
技术标签:
【中文标题】字典视图对象与集合【英文标题】:Dictionary view objects vs sets 【发布时间】:2020-09-02 09:09:50 【问题描述】:我一直在阅读由dict.keys()
之类返回的这些字典视图对象,包括此处有关该主题的帖子。我知道它们充当字典内容的窗口,而不显式存储所述内容的副本,因此比动态更新键列表更有效。我还发现它们是容器(允许使用 in
运算符),但它们是不是序列(不可索引),尽管它们是可迭代的。
总体而言,这对我来说听起来像是set
,因为他们可以访问字典的哈希表,他们甚至提供使用类似set
的操作,例如交集/差异。我能想到的一个区别是 set
虽然像这些视图对象一样可变,但只能存储不可变(因此是可散列的)对象。
然而,由于字典 value 不必是不可变的,values
和 items
视图对象本质上是具有可变内容的 set
s,预计 不是 支持set
-like 运算(减法/相交)。这让我怀疑将这些视图对象视为“带有字典引用的set
”。
我的问题是:这些视图对象是否与集合完全不同但恰好具有相似的属性?或者它们是使用集合实现的?两者之间还有其他主要区别吗?最重要的是 - 将它们视为“基本上是set
s”会不会有害?
【问题讨论】:
“字典值不必是不可变的”,但字典键必须是(嗯,它需要是可散列的,就像集合一样)。这些视图如何实现并不重要,就像您说它们作为可迭代容器工作一样,这就是您需要知道的全部。理论上,实际的实现可能会从一个 Python 版本更改为下一个版本。如果需要,您可以将它们视为不可变集合(.keys()
的文档说它是“类集合对象”),因为它们提供相同的操作(尽管它们中的每一个不一定具有相同的复杂性)。
【参考方案1】:
您比较的隐含点是dict.keys()
和set
元素不能有重复项。但是,从键获得的类集合 Dictionary 视图仍然保留顺序,而集合则没有。
重复的字典键:
If a key occurs more than once, the last value for that key becomes the corresponding value in the new dictionary.
重复的集合元素:
A set object is an unordered collection of distinct hashable objects.
从上面看,set
s 是无序的,而在当前 Python 版本的字典中保持插入顺序:
Changed in version 3.7: Dictionary order is guaranteed to be insertion order.
因为字典有一个插入顺序,所以它们可以颠倒,而在集合中这样的操作是没有意义的:
Dictionaries and dictionary views are reversible.
最后,set
可以被更改、删除和插入。 Dictionary 视图对象只允许查看内容,而不能更改它们。
我的问题是,这些视图对象是否与集合完全不同,但恰好具有相似的属性?还是它们是使用集合实现的?
文档没有对实现细节提出任何要求。
两者之间还有其他主要区别吗?
文档说明了“键视图”和“项目视图”或“值视图”之间的区别。
Keys views are set-like (...)
If all values are hashable, so that (key, value) pairs are unique and hashable, then the items view is also set-like.
(Values views are not treated as set-like (...))
【讨论】:
以上是关于字典视图对象与集合的主要内容,如果未能解决你的问题,请参考以下文章