Python两层嵌套字典按键排序的Pythonic实现方法
两层嵌套字典按键排序的Pythonic实现
问题描述
现有如下结构的两层嵌套字典对象:
dict_1 = { 'c': { 'c3': [], 'c1': [], 'c2': [] }, 'a': { 'a3': [], 'a1': [], 'a2': [] }, 'b': { 'b3': [], 'b1': [], 'b2': [] }, }
需要完成两个层级的字典按键排序操作:
- 第一层(顶层):按照顶层字典的键做升序排序
- 第二层(子层):每个顶层键对应的嵌套字典,按照自身的键做升序排序
排序完成后的预期输出如下:
dict_1 = { 'a': { 'a1': [], 'a2': [], 'a3': [] }, 'b': { 'b1': [], 'b2': [], 'b3': [] }, 'c': { 'c1': [], 'c2': [], 'c3': [] }, }
实现方案
你目前写出的嵌套字典推导式已经符合Python编码风格,还可以做进一步简化,让代码更简洁易读:
由于字典items()返回的键值对元组,默认排序规则就是按元组首位(也就是字典键)排序,不需要额外传入key参数指定lambda规则;同时内层排序后的键值对可以直接用dict()构造器生成新字典,不需要额外写内层推导式,简化后的代码如下:
dict_1 = {k: dict(sorted(v.items())) for k, v in sorted(dict_1.items())}
运行后输出结果和预期完全一致:
{'a': {'a1': [], 'a2': [], 'a3': []}, 'b': {'b1': [], 'b2': [], 'b3': []}, 'c': {'c1': [], 'c2': [], 'c3': []}}
注意:该写法依赖Python 3.7+版本的字典特性——从Python 3.7开始,普通字典正式保证插入顺序留存;如果需要兼容3.7以下版本,请使用
collections.OrderedDict替代普通字典存储排序结果。
如果需要处理更深层级的嵌套字典排序,可以封装通用递归函数,无需逐层手写排序逻辑:
def sort_nested_dict(input_dict): sorted_dict = {} for key, value in sorted(input_dict.items()): sorted_dict[key] = sort_nested_dict(value) if isinstance(value, dict) else value return sorted_dict dict_1 = sort_nested_dict(dict_1)
该函数会自动遍历所有嵌套层级,对每一层字典都执行按键升序排序,适配任意深度的字典嵌套场景。
内容的提问来源于stack exchange,提问作者John Byro
相关产品推荐
相关产品推荐

