
本文介绍如何高效比较两个字典列表,基于共同的 `"time"` 键提取对应 `"value"` 字段,构建形如 `{"def": "pqr"}` 的键值映射字典,避免 o(n²) 嵌套遍历,推荐使用哈希索引法提升性能。
在处理时间序列数据(如 API 响应、日志记录或传感器采样)时,常需对多个字典列表按时间戳对齐并建立字段映射。原始需求中,list1 和 list2 各含若干带 "time" 与 "value" 键的字典,目标是:当两列表中字典的 "time" 值相等时,以 list1 的 "value" 为 key、list2 的 "value" 为 value,生成最终映射字典。
直接使用 itertools.product(如提问中尝试)虽逻辑直观,但时间复杂度为 O(m×n),且需额外过滤 None 值,代码冗余、可读性差。更优解是空间换时间:先将 list1 构建成以 "time" 为键、字典本身为值的查找字典(即哈希索引),再单次遍历 list2 完成匹配。
以下是推荐实现(简洁、高效、可读性强):
list1 = [
{"time": "2024-01-29T18:32:24.000Z", "value": "abc"},
{"time": "2024-01-30T19:47:48.000Z", "value": "def"},
{"time": "2024-01-30T19:24:20.000Z", "value": "ghi"},
]
list2 = [
{"time": "2024-01-30T18:34:44.000Z", "value": "xyz"},
{"time": "2024-01-30T19:47:48.000Z", "value": "pqr"},
{"time": "2024-01-30T19:24:20.000Z", "value": "jkl"},
]
# 步骤1:构建 list1 的 time → dict 索引(O(len(list1)))
index_by_time = {d["time"]: d for d in list1}
# 步骤2:遍历 list2,匹配 time 并构建结果字典(O(len(list2)))
result = {
index_by_time[d["time"]]["value"]: d["value"]
for d in list2
if d["time"] in index_by_time
}
print(result)
# 输出: {'def': 'pqr', 'ghi': 'jkl'}✅ 优势说明:
立即学习“Python免费学习笔记(深入)”;
- 时间复杂度优化:从 O(m×n) 降至 O(m + n),适用于大规模数据;
- 代码简洁性:使用字典推导式,逻辑一目了然;
- 健壮性增强:if d["time"] in index_by_time 避免 KeyError,无需异常处理;
- 扩展友好:若需支持多对一或一对多映射,仅需调整 index_by_time 的结构(如用 defaultdict(list))。
⚠️ 注意事项:
- 确保所有字典均含 "time" 和 "value" 键,否则会触发 KeyError;生产环境建议添加键存在性校验(如 d.get("time"));
- 若 list1 中存在重复 "time" 值,后出现的字典会覆盖前者——这是字典赋值的默认行为,符合多数场景需求;如需保留全部,应改用列表嵌套结构;
- 时间字符串格式需严格一致(本例中均为 ISO 8601 标准),无需解析为 datetime 对象即可安全比对。
该方法兼顾性能、可维护性与 Pythonic 风格,是字典列表条件匹配任务的标准实践方案。










