You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中字典列表按时间键匹配并构建映射字典的实现问题

Python中字典列表按时间键匹配并构建映射字典的实现问题

我明白你现在的需求——要把两个字典列表里时间字段相同的项,用list1的value做键、list2的value做值,拼成目标字典。你当前用itertools.product的思路方向是对的,但确实需要调整一下才能得到想要的字典格式,而且还有更高效的实现方式,我来一步步给你讲清楚:


方法一:改进你现有的itertools.product写法

你当前的列表推导式生成了带None的元素,我们可以直接过滤掉不匹配的组合,再把符合条件的键值对转换成字典:

import itertools

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"}]

# 用生成器表达式过滤匹配项,直接转为字典
output = dict(
    (x['value'], y['value'])
    for x, y in itertools.product(list1, list2)
    if x['time'] == y['time']
)

print(output)  # 输出: {'def': 'pqr', 'ghi': 'jkl'}

这里直接把匹配到的元组(x['value'], y['value'])传给dict(),它会自动帮你构建键值对,不需要处理多余的None。


方法二:更高效的字典映射法(推荐)

用itertools.product的问题是,当两个列表规模较大时,会生成大量不必要的两两组合,时间复杂度是O(n*m),效率很低。更好的方式是先把其中一个列表转成以time为键的映射字典,这样查找匹配项的时间复杂度是O(1),整体效率提升到O(n+m):

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"}]

# 先将list2转换为 time -> value 的映射字典
time_to_list2_val = {item['time']: item['value'] for item in list2}

# 遍历list1,匹配时间并构建目标字典
output = {
    item['value']: time_to_list2_val[item['time']]
    for item in list1
    if item['time'] in time_to_list2_val
}

print(output)  # 输出: {'def': 'pqr', 'ghi': 'jkl'}

这种写法不仅效率更高,可读性也更强,适合处理大规模数据的场景。


关于你提到的lambda函数实现

如果一定要用lambda来实现,可以结合filter和map来完成,但可读性不如前面的推导式,仅作参考:

import itertools

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"}]

# 用lambda过滤匹配组合,再映射为键值对元组,最后转字典
output = dict(
    map(lambda pair: (pair[0]['value'], pair[1]['value']),
        filter(lambda pair: pair[0]['time'] == pair[1]['time'],
               itertools.product(list1, list2))
    )
)

print(output)  # 输出: {'def': 'pqr', 'ghi': 'jkl'}

总结一下:如果数据量较小,用方法一也能解决问题;但如果数据量较大,强烈推荐方法二,既高效又易维护。

备注:内容来源于stack exchange,提问作者pats4u

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.20 10:18:05