如何将Python嵌套字典按键深度升序排序后打印为YAML格式
嵌套字典按层级规则排序生成目标YAML的实现方法
因为PyYAML在sort_keys=False模式下会完全保留传入字典的插入顺序,要实现“同层级下标量类型键在前、嵌套字典类型键在后”的输出效果,只需要在序列化前对原字典做一次递归重排即可,不需要修改原有字典的键定义逻辑。
实现规则
按如下逻辑递归处理每一层字典:
- 遍历当前层所有键值对,拆分为两组
- 第一组:值为非字典类型的键值对(即直接输出标量值的键)
- 第二组:值为嵌套字典类型的键值对,需要对这类值递归执行相同的排序逻辑
- 重排当前层字典的顺序:先放入第一组的所有键值对,再放入第二组的所有键值对
- 同组内的键完全保留原字典中的相对插入顺序,不会额外按键名字母排序
可直接复用的代码
import yaml def sort_dict_by_value_type(raw_dict): reorganized = {} leaf_items = {} nested_items = {} for key, value in raw_dict.items(): if isinstance(value, dict): # 递归处理嵌套字典结构 nested_items[key] = sort_dict_by_value_type(value) else: leaf_items[key] = value # 先排列标量键,再排列嵌套字典键,全程保留组内原有顺序 reorganized.update(leaf_items) reorganized.update(nested_items) return reorganized # 传入原有业务逻辑生成的字典mydict processed_dict = sort_dict_by_value_type(mydict) print(yaml.dump(processed_dict, sort_keys=False))
匹配效果说明
运行上述代码后,输出的YAML会完全符合你给出的目标格式:
DeviceInfo层级下,autoApply、comment、networkRole、region、group这些标量键会全部排列在contact、location两个嵌套字典之前- 嵌套字典内部的键顺序完全保留原有定义顺序,不会被打乱
- 全程未开启字典键的字母排序,和你之前依赖
sort_keys=False保留自定义顺序的使用习惯完全兼容
内容的提问来源于stack exchange,提问作者user1768233
相关产品推荐
相关产品推荐

