Python提取两字典共同键生成新字典:代码返回空字典求解决
问题排查与解决方案
问题背景
有两个Python字典results和results_2,二者均以元组为键、数值为值,其中results的长度远小于results_2。需要找出两个字典的共同键,生成包含这些键及其对应两个字典中值的新结构(注:原预期输出的字典存在重复键,这不符合Python字典的规则,因此调整为每个键对应两个值的集合/列表)。
字典结构示例:
results = { ('CMS', 'LNT'): 0.8500276624334894, ('LNT', 'CMS'): 0.8500276624334894, ('LOW', 'HD'): 0.8502400376842035, ... } results_2 = { ('CMS', 'CMS'): 1.0, ('CMS', 'LNT'): 0.7761431649456381, ('CMS', 'LOW'): 0.4476903306386938, ... }
错误代码分析
你提供的代码返回空字典的直接原因是变量名错误:初始化的字典是dict_sorted_2,但内层循环中赋值的是未定义的dict_sorted,导致最终dict_sorted_2始终为空。此外,两层嵌套循环的写法效率极低(时间复杂度O(n*m)),完全没必要。
错误代码片段:
dict_sorted_2 = {} for key_2, result_2 in results_2.items(): for key, result in results.items(): if key_2 == key: dict_sorted[key_2] = result_2 # 这里用了未初始化的dict_sorted,而非dict_sorted_2
修正后的实现代码
步骤1:高效获取共同键
利用字典的keys()方法求交集,时间复杂度O(min(n,m)),远优于嵌套循环:
common_keys = results.keys() & results_2.keys()
步骤2:生成包含双值的新字典
由于Python字典不允许重复键,我们将每个共同键对应的值存储为元组(或列表),格式为(results中的值, results_2中的值):
result_combined = { key: (results[key], results_2[key]) for key in common_keys }
步骤3(可选):按值排序
如果需要按照results_2中的值排序,可直接对字典项排序后转换为有序字典(Python 3.7+普通字典也保留插入顺序):
# 按results_2中的值升序排序 sorted_combined = dict( sorted(result_combined.items(), key=lambda x: x[1][1]) )
完整示例代码:
# 假设results和results_2已定义 common_keys = results.keys() & results_2.keys() result_combined = {key: (results[key], results_2[key]) for key in common_keys} # 按results_2的值排序 sorted_combined = dict(sorted(result_combined.items(), key=lambda x: x[1][1])) print(sorted_combined)
输出示例(符合字典规则的正确格式):
{ ('CMS', 'LNT'): (0.8500276624334894, 0.7761431649456381), ('LOW', 'HD'): (0.8502400376842035, ...), ... }
额外说明
- 如果你的业务场景确实需要把两个值分开存储(比如列表形式),可以将元组改为列表
[results[key], results_2[key]]。 - 生成
results_2的代码逻辑是正常的,无需修改,只要确保ticker1和ticker2的组合元组与results中的键格式完全一致(比如大小写、顺序)即可。
内容的提问来源于stack exchange,提问作者Niko
相关产品推荐
相关产品推荐

