为何dict_keys对象比较相等时忽略顺序,dict_values对象却不?
为什么dict_keys比较忽略顺序,而dict_values不行?
这本质是Python里两种视图对象的设计逻辑完全不同:
dict_keys(包括Counter的keys视图)是类集合视图:它的行为和集合(set)一致,比较的时候只看元素是否完全相同,完全不关心顺序——就像
{'x','y'}和{'y','x'}相等是一个道理。毕竟字典的键本身就是唯一且无序的(虽然3.7+字典会保留插入顺序,但键的集合特性没变),所以键视图的比较逻辑贴合集合的特性。dict_values是序列式动态视图:它没有集合特性,而是严格遵循字典的插入顺序,保存对应键的值序列。当你直接比较两个dict_values对象时,它会像列表一样逐项按顺序对比——只有每个位置上的元素都一致,才会返回True。比如你先给Counter加
x再加y,values的顺序是[3,1];先加y再加x,values顺序是[1,3],这两个序列逐项比的话自然不相等。
举个实际代码例子:
from collections import Counter # 先加x后加y c1 = Counter(x=3, y=1) # 先加y后加x c2 = Counter(y=1, x=3) print(c1.keys() == c2.keys()) # 输出True,因为键的集合完全一致 print(c1.values() == c2.values()) # 输出False,因为值的顺序不同 print(sorted(c1.values()) == sorted(c2.values())) # 输出True,排序后顺序统一
为什么values不做成集合视图?因为字典的值允许重复,集合无法保留重复值;而且很多场景下我们需要值和键的顺序对应,所以values视图设计成了保留顺序的序列式结构,而不是集合。
内容的提问来源于stack exchange,提问作者topquartile
相关产品推荐
相关产品推荐

