字典视图对象与集合

Posted

技术标签:

【中文标题】字典视图对象与集合【英文标题】:Dictionary view objects vs sets 【发布时间】:2020-09-02 09:09:50 【问题描述】:

我一直在阅读由dict.keys() 之类返回的这些字典视图对象,包括此处有关该主题的帖子。我知道它们充当字典内容的窗口,而不显式存储所述内容的副本,因此比动态更新键列表更有效。我还发现它们是容器(允许使用 in 运算符),但它们是不是序列(不可索引),尽管它们可迭代的。

总体而言,这对我来说听起来像是set,因为他们可以访问字典的哈希表,他们甚至提供使用类似set 的操作,例如交集/差异。我能想到的一个区别是 set 虽然像这些视图对象一样可变,但只能存储不可变(因此是可散列的)对象。

然而,由于字典 value 不必是不可变的,valuesitems 视图对象本质上是具有可变内容的 sets,预计 不是 支持set-like 运算(减法/相交)。这让我怀疑将这些视图对象视为“带有字典引用的set”。

我的问题是:这些视图对象是否与集合完全不同但恰好具有相似的属性?或者它们是使用集合实现的?两者之间还有其他主要区别吗?最重要的是 - 将它们视为“基本上是sets”会不会有害?

【问题讨论】:

“字典值不必是不可变的”,但字典键必须是(嗯,它需要是可散列的,就像集合一样)。这些视图如何实现并不重要,就像您说它们作为可迭代容器工作一样,这就是您需要知道的全部。理论上,实际的实现可能会从一个 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.

从上面看,sets 是无序的,而在当前 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 (...))

【讨论】:

以上是关于字典视图对象与集合的主要内容,如果未能解决你的问题,请参考以下文章

[Language]Python映像与集合--字典

JavaScript实现集合与字典

Python中字典和集合

元组字典与集合

数组集合与字典

列表元组字典集合与字符串