本文介绍在python中高效比较两个含时间戳字典列表(如api响应数据),通过哈希索引实现o(n+m)时间复杂度的精准匹配,并生成{"list1_value": "list2_value"}格式的映射字典。
在处理时序数据(如日志、监控指标或API返回的带时间戳记录)时,常需跨两个列表按时间字段(如 "time")对齐并提取对应值。若直接使用嵌套循环或 itertools.product(时间复杂度 O(n×m)),不仅低效,还会产生冗余判断和空值干扰(如原问题中输出大量 None)。更优解是构建哈希索引 + 单次遍历——即用字典预存 list1 中 "time" 到完整字典的映射,再遍历 list2 快速查找匹配项。
以下是推荐实现(已优化可读性与健壮性):
list1 = [
{"time": "2025-01-29T18:32:24.000Z", "value": "abc"},
{"time": "2025-01-30T19:47:48.000Z", "value": "def"},
{"time": "2025-01-30T19:24:20.000Z", "value": "ghi"},
]
list2 = [
{"time": "2025-01-30T18:34:44.000Z", "value": "xyz"},
{"time": "2025-01-30T19:47:48.000Z", "value": "pqr"},
{"time": "2025-01-30T19:24:20.000Z", "value": "jkl"},
]
# 步骤1:构建 list1 的 time → dict 索引(O(n))
index_map = {item["time"]: item for item in list1}
# 步骤2:遍历 list2,匹配 time 并构建结果字典(O(m))
result = {}
for item2 in list2:
t = item2["time"]
if t in index_map: # 哈希查找,平均 O(1)
result[index_map[t]["value"]] = item2["value"]
print(result) # {'def': 'pqr', 'ghi': 'jkl'}✅ 优势说明:
⚠️ 注意事项:
# 安全版索引构建(跳过缺失键的项)
index_map = {}
for item in list1:
if "time" in item and "value" in item:
index_map[item["time"]] = item? 进阶技巧:
也可用字典推导式一行写出(适合简单场景):
result = {item1["value"]: item2["value"]
for item2 in list2
for item1 in list1
if item1["time"] == item2["time"]}但此写法本质仍是 O(n×m),不推荐用于大数据量。
综上,哈希索引法是解决此类“按字段关联字典列表”问题的标准实践,兼顾性能、可读性与工程鲁棒性。