Python嵌套字典按内层值排序后直接调用变量与print输出差异原因求解
问题原因分析
- 你遇到的现象核心是运行环境的交互式输出做了额外的排序处理,该场景大概率出现在旧版本的IPython/Jupyter Notebook运行环境中。
- 首先确认你的排序逻辑本身是正确的:Python 3.7及以上版本的内置字典会默认保留插入顺序,你将内层字典按value降序排序后通过字典推导式重新赋值给
d2对应键的操作是生效的,print(d2)输出的就是字典的真实存储顺序,结果符合预期。 - 旧版IPython/Jupyter的交互式运行环境中,直接输入变量名输出对象时,会默认对字典的键做升序排序后再展示,这个是环境层面额外加的展示优化逻辑,和字典本身的实际存储顺序没有关系,所以你直接输入
d2看到的是按键排序后的误导性结果,并非字典的真实状态。 - 如果你使用的是Python 3.6及更低版本,内置字典本身不保证保留插入顺序,也可能出现输出顺序不稳定的情况,该场景下建议改用
collections.OrderedDict来保证顺序可控。
验证方法
你可以执行以下代码查看字典的真实存储顺序,避开环境的展示干扰:
# 遍历输出每个内层字典的键的实际顺序 for outer_key in d2: print(f"外层键{outer_key}对应的内层键顺序:", list(d2[outer_key].keys()))
输出的顺序会和print(d2)的结果完全一致,即可证明排序已经生效。
规避方案
如果不想再出现展示偏差,可以选择以下任意一种方案:
- 升级IPython到7.0及以上版本,该版本之后的IPython已经和Python官方行为对齐,不会额外对字典键做排序处理
- 校验字典顺序时优先使用
print输出或者直接遍历键查看顺序,不要依赖交互式环境的直接变量输出结果
内容的提问来源于stack exchange,提问作者user228
相关产品推荐
相关产品推荐

