字典视图对象与集合

时间:2020-09-02 09:09:50

标签: python dictionary view set

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

总体上,这听起来像set,因为他们可以访问字典的哈希表,所以他们甚至还提供类似set的操作,例如交集/差值。我可以想到的一个区别是set尽管像这些视图对象一样易变,但只能存储不可变(因此可哈希化)的对象。

但是,由于字典值不必是不变的,因此值和项视图对象本质上是具有可变内容的set,希望支持{{1} }类运算(减法/相交)。这使我不愿将这些视图对象视为“具有引用字典的set”。

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

1 个答案:

答案 0 :(得分:1)

您进行比较的隐含点是setset元素不能重复。但是,从键获得的类似集合的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是无序的,而在当前的Python版本中,字典保持插入顺序:

Changed in version 3.7: Dictionary order is guaranteed to be insertion order.

由于字典具有插入顺序,因此它们可以颠倒,而集合中的此类操作将毫无意义:

Dictionaries and dictionary views are reversible.

最后,school;sex;age;address;famsize;Pstatus;Medu;Fedu;Mjob;Fjob;reason;guardian;traveltime;studytime;failures;schoolsup;famsup;paid;activities;nursery;higher;internet;romantic;famrel;freetime;goout;Dalc;Walc;health;absences;G1;G2;G3 "GP";"F";18;"U";"GT3";"A";4;4;"at_home";"teacher";"course";"mother";2;2;0;"yes";"no";"no";"no";"yes";"yes";"no";"no";4;3;4;1;1;3;6;"5";"6";6 "GP";"F";17;"U";"GT3";"T";1;1;"at_home";"other";"course";"father";1;2;0;"no";"yes";"no";"no";"no";"yes";"yes";"no";5;3;3;1;1;3;4;"5";"5";6 "GP";"F";15;"U";"LE3";"T";1;1;"at_home";"other";"other";"mother";1;2;3;"yes";"no";"yes";"no";"yes";"yes";"yes";"no";4;3;2;2;3;3;10;"7";"8";10 "GP";"F";15;"U";"GT3";"T";4;2;"health";"services";"home";"mother";1;3;0;"no";"yes";"yes";"yes";"yes";"yes";"yes";"yes";3;2;2;1;1;5;2;"15";"14";15 可以被更改,删除和插入。词典视图对象仅允许查看内容,而不能对其进行更改。

我的问题是,这些视图对象与集合完全不同,但碰巧具有相似的属性吗?还是使用集合来实现?

该文档不主张实现细节。

两者之间还有其他主要区别吗?

文档说明了“键视图”和“项视图”或“值视图”之间的区别。

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 (...))