You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 19:05:56