Jupyter Notebook做数据分析时函数返回字典顺序与print不一致如何解决
问题原因
- 该顺序差异本质是Python字典的有序性规则差异:Python 3.6及更早版本的内置
dict为无序结构,键的存储顺序和插入顺序无关;Python 3.7及以上版本才将「保留插入顺序」定为内置dict的官方语言特性。 - 即便你使用的是3.7+版本,部分旧版本的Jupyter Notebook、数据序列化逻辑或第三方工具,也可能会自动对字典的键做字母排序后展示,你遇到的print输出正常、return结果顺序变化,大概率就是Jupyter的输出渲染逻辑默认触发了键排序。
解决方案
如果需要强制保证male键始终在前,最稳妥的跨版本兼容方案是使用Python标准库自带的collections.OrderedDict,它会严格保留键的插入顺序,不受Python版本和展示工具的影响。
修改后的代码示例:
def chickenpox_by_sex(): import numpy as np import pandas as pd from collections import OrderedDict df = pd.read_csv("NISPUF17.csv") male_1dose_nopox = df[(df['P_NUMVRC'] >=1) & (df['HAD_CPOX'] == 1) & (df['SEX'] == 1)] female_1dose_nopox = df[(df['P_NUMVRC'] >=1) & (df['HAD_CPOX'] == 1) & (df['SEX'] == 2)] male_1dose_pox = df[(df['P_NUMVRC'] >=1) & (df['HAD_CPOX'] == 2) & (df['SEX'] == 1)] female_1dose_pox = df[(df['P_NUMVRC'] >=1) & (df['HAD_CPOX'] == 2) & (df['SEX'] == 2)] ratio_male = male_1dose_nopox.shape[0]/male_1dose_pox.shape[0] ratio_female = female_1dose_nopox.shape[0]/female_1dose_pox.shape[0] # 改用OrderedDict,严格保留插入顺序 di = OrderedDict() di['male'] = ratio_male di['female'] = ratio_female print(di) return di
如果你的运行环境确定只使用Python 3.7及以上版本,也可以继续使用内置dict,只需关闭Jupyter的输出自动排序功能即可。
内容的提问来源于stack exchange,提问作者JoaoCalheiros
相关产品推荐
相关产品推荐

