我一直在阅读由dict.keys()
之类返回的这些字典视图对象,包括此处有关该主题的帖子。我知道它们充当词典内容的窗口,而无需显式存储所述内容的副本,因此比动态更新键列表更有效。我还发现它们是容器(允许使用in
运算符),但是它们是不序列(不可索引),尽管它们是可迭代的。
总体上,这听起来像set
,因为他们可以访问字典的哈希表,所以他们甚至还提供类似set
的操作,例如交集/差值。我可以想到的一个区别是set
尽管像这些视图对象一样易变,但只能存储不可变(因此可哈希化)的对象。
但是,由于字典值不必是不变的,因此值和项视图对象本质上是具有可变内容的set
,希望不支持{{1} }类运算(减法/相交)。这使我不愿将这些视图对象视为“具有引用字典的set
”。
我的问题是,这些视图对象与集合完全不同,但碰巧具有相似的属性吗?还是使用集合来实现?两者之间还有其他主要区别吗?而且最重要的是-将它们视为“基本上set
”是否有害?
答案 0 :(得分:1)
您进行比较的隐含点是set
和set
元素不能重复。但是,从键获得的类似集合的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.
由于字典具有插入顺序,因此它们可以颠倒,而集合中的此类操作将毫无意义:
最后,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
可以被更改,删除和插入。词典视图对象仅允许查看内容,而不能对其进行更改。
我的问题是,这些视图对象与集合完全不同,但碰巧具有相似的属性吗?还是使用集合来实现?
该文档不主张实现细节。
两者之间还有其他主要区别吗?
文档说明了“键视图”和“项视图”或“值视图”之间的区别。