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
相关产品推荐
相关产品推荐

