如何通过迭代从两个字典提取键值生成按集群分组的合并字典?
字典合并实现方案
输入数据
dict_1(PIN码对应代码与概率)
dict_1 = { 8063: {'code15': 99.61, 'code17': 96.14}, 9621: {'15': 88.59}, 1583: {'code17': 99.37, 'code14': 87.37}, 7631: {'code17': 99.88}, 4345: {'code11': 99.97, 'code12': 99.93}, 1799: {'code11': 99.8, 'code12': 99.18}, 3604: {'code17': 98.77}, 1098: {'code12': 99.96}, 3752: {'code11': 99.95} }
dict_2(集群对应PIN与名称)
dict_2 = { 0: { 'count': 4, 'id': [ {'pin': 8063, 'name': 'John'}, {'pin': 9621, 'name': 'Maria'}, {'pin': 1583, 'name': 'Peter'}, {'pin': 7631, 'name': 'Jess'} ] }, 3: { 'count': 5, 'id': [ {'pin': 4345, 'name': 'George'}, {'pin': 1799, 'name': 'Kevin'}, {'pin': 3604, 'name': 'Sarah'}, {'pin': 1098, 'name': 'Stewie'}, {'pin': 3752, 'name': 'Jan'} ] } }
预期输出
merged_dict = { 0: { 'code15': [99.61, 8063, 'John', 88.59, 9621, 'Maria'], 'code17': [99.37, 1583, 'Peter', 96.14, 8063, 'John', 99.88, 7631, 'Jess'], 'code14': [87.37, 1583, 'Peter'] }, 3: { 'code11': [99.97, 4345, 'George', 99.8, 1799, 'Kevin', 99.95, 3752, 'Jan'], 'code12': [99.93, 4345, 'George', 99.18, 1799, 'Kevin', 99.96, 1098, 'Stewie'] } }
(注:你提供的原始预期输出中集群0的code17包含了集群3的3604数据,属于输入对应错误,上述预期输出已修正为符合输入逻辑的结果)
实现代码
# 初始化合并字典 merged_dict = {} # 遍历每个集群 for cluster_id, cluster_info in dict_2.items(): merged_dict[cluster_id] = {} # 遍历集群内的每个PIN项 for pin_item in cluster_info['id']: pin = pin_item['pin'] name = pin_item['name'] # 获取当前PIN对应的代码与概率,若不存在则返回空字典 code_prob_map = dict_1.get(pin, {}) for code, prob in code_prob_map.items(): # 统一代码格式:给无'code'前缀的键添加前缀 if not code.startswith('code'): code = f'code{code}' # 若当前代码未在集群字典中,初始化空列表 if code not in merged_dict[cluster_id]: merged_dict[cluster_id][code] = [] # 添加概率、PIN、名称到对应列表 merged_dict[cluster_id][code].extend([prob, pin, name]) # 输出结果 print(merged_dict)
代码说明
- 遍历
dict_2的每个集群,为每个集群初始化空字典存储合并结果 - 对每个集群内的PIN项,从
dict_1中获取对应的代码与概率映射 - 统一代码命名格式(处理
9621对应的'15'转为'code15'的情况) - 将每个代码对应的概率、PIN、名称按顺序追加到对应列表中
- 自动忽略
dict_1中不存在的PIN(若有),避免程序报错
内容的提问来源于stack exchange,提问作者trav_is_false
相关产品推荐
相关产品推荐

