如何按嵌套字典列表内的指定key对外部字典列表进行排序
Python 嵌套列表字典的多场景排序实现
你当前的问题核心是每个顶层条目下的
data是包含多个字典的列表,排序前需要先明确以data列表中哪条数据的目标字段作为排序依据,常见的可选规则包括:
- 取
data中time最新/最早的条目对应字段值- 取
data中所有条目对应字段的最大值/最小值- 取
data中type为test/real的固定类型条目对应字段值
前置修正
你给出的示例数据中第二个data元素存在key笔误,tp:多了一个冒号,需要先修正为tp,否则会触发KeyError。
通用实现方案
全程使用Python标准库即可完成,无需额外依赖,我们以最常用的「取data中时间最新的条目对应字段值」作为排序规则为例,实现如下:
首先导入依赖的标准库:
from datetime import datetime
编写字段提取辅助函数:
def _get_sort_key(item, param): # 匹配顶层字段(如name) if param in item: return item[param] # 匹配data嵌套字段 # 先将data按时间倒序,取最新的一条数据 sorted_data = sorted( item["data"], key=lambda x: datetime.strptime(x["time"], "%a %b %d %H:%M:%S %Y"), reverse=True ) latest_entry = sorted_data[0] # 时间字段转为datetime对象再返回,保证排序逻辑正确 if param == "time": return datetime.strptime(latest_entry["time"], "%a %b %d %H:%M:%S %Y") return latest_entry[param]
修改你的sort_by方法:
def sort_by(self, param, rev=False): self.json_list = sorted( self.json_list, key=lambda k: _get_sort_key(k, param), reverse=rev ) return self.json_list
其他规则适配
如果需要修改排序取值规则,只需要调整_get_sort_key中data部分的逻辑即可:
- 取
data中param字段最大值:return max(x[param] for x in item["data"]) - 取
data中type为real的条目值:return next(x[param] for x in item["data"] if x["type"] == "real") - 取
data中第一个出现对应param的条目值:return next(x[param] for x in item["data"] if param in x)
异常兜底建议
如果存在部分data列表为空、或者部分data元素没有目标param字段的场景,可以加默认值兜底避免报错,比如:
# 找不到对应值时,数值类型默认返回0,字符串默认返回空串 return latest_entry.get(param, 0 if param in ("tp", "df", "db") else "")
内容的提问来源于stack exchange,提问作者AndrewE
相关产品推荐
相关产品推荐

