如何基于可配置的动态key对嵌套字典列表结构的响应数据进行排序
实现思路
- 先定义通用的嵌套字段取值工具,支持按
字段路径(用.分隔层级)从任意嵌套结构里取排序键值,对于列表类型的层级可以指定索引取值(比如要取第一个地址的城市就用addresses.0.city) - 排序逻辑直接复用Python内置的
sorted方法,通过配置的排序字段动态生成排序key,支持灵活切换排序字段、调整正/倒序。
完整实现代码
# 示例原始数据 data = [ {"type":"single", "ra":"SI-11", "name":{ "f_name":"Jon", "l_name":"Devi", "prefix":"Mr"}, "addresses":[ {"address": "123St","city": "New York","state": "NY"}, {"address": "14St","city": "New York","state": "NY"} ], "racks": ["racks1", "rack2"], }, {"type":"multiple", "ra":"SI-44", "name":{ "f_name":"Patrik", "l_name":"Dev", "prefix":"Mr"}, "addresses":[ {"address": "333St","city": "New York","state": "NY"}, {"address": "14000St","city": "New York","state": "NY"} ], "racks": ["racks1", "rack2"], } ] def get_nested_value(item: dict, field_path: str): """从嵌套字典/列表结构中按路径取值""" keys = field_path.split(".") value = item for key in keys: # 如果当前层级是列表,就把key转成数字索引取值 if isinstance(value, list): try: key = int(key) value = value[key] except (IndexError, ValueError): # 索引不存在或者转数字失败返回空值,避免排序报错 return "" else: # 字典层级直接按键取值,不存在返回空值 value = value.get(key, "") return value def sort_by_config(data: list, sort_field: str, reverse: bool = False): """ 按配置字段对数据排序 :param data: 待排序的原始数据列表 :param sort_field: 排序字段路径,支持嵌套: 一级字段直接传:"type" / "ra" 二级嵌套字典字段:"name.f_name" / "name.l_name" 列表内嵌套字段:"addresses.0.city"(取第一个地址的城市) :param reverse: 是否倒序,默认False正序 :return: 排序后的数据 """ return sorted(data, key=lambda x: get_nested_value(x, sort_field), reverse=reverse)
调用示例
# 按一级字段type排序 sorted_by_type = sort_by_config(data, "type") # 按name下的f_name排序 sorted_by_fname = sort_by_config(data, "name.f_name") # 按第一个地址的city倒序排序 sorted_by_city = sort_by_config(data, "addresses.0.city", reverse=True)
扩展说明
- 如果需要支持多字段排序,只需要把
sort_field改成列表类型,key返回对应多个字段的元组即可 - 非字符串类型的字段(比如数字、日期)排序逻辑也可以直接复用,不需要改底层取值代码
内容的提问来源于stack exchange,提问作者Iceman
相关产品推荐
相关产品推荐

