Python中如何合并两个字典,按对应键生成目标结构的字典?
解决字典匹配生成新字典的问题
问题背景
现有两个字典,r存储序列字符串,pr存储对应序列的参数列表:
r = {'seq1': 'cgatcgatacgatgcgatgctagatcgagtgcatcgcggcgccgcgcgcgcatgcagcagctacgatgcattaatccgatcgatcgagtacgatata', 'seq2':'cgatcgatacgatgcgatgctagatcgagtgcatcgcggcgccgcgcgcgcatgcagcagctacgatgcattaatccgatcgatcgagt', 'seq3':'cgatcgatacgatgcgatgctagatcgagtgcatcgcggcgccgcgcgcgcatgcagcagctacgatgcattaatccgatcgatcgagtacgatatataatatacgatcagctagcc'} pr = {'seq1': [(124, 22), (114, 22)], 'seq2': [(100, 22)], 'seq3': [(124, 22)]}
当前代码用嵌套循环遍历,导致每个r的键都匹配了pr的所有值,输出出现冗余:
for key, val in r.items(): for val2 in pr.values(): print({'name': key, 'size': len(val), 'p_list' : val2})
错误输出:
{'name': 'seq1', 'size': 163, 'p_list': [(124, 22), (114, 22)]} {'name': 'seq1', 'size': 163, 'p_list': [(100, 22)]} {'name': 'seq1', 'size': 163, 'p_list': [(124, 22)]} {'name': 'seq2', 'size': 163, 'p_list': [(124, 22), (114, 22)]} {'name': 'seq2', 'size': 163, 'p_list': [(100, 22)]} {'name': 'seq2', 'size': 163, 'p_list': [(124, 22)]} {'name': 'seq3', 'size': 215, 'p_list': [(124, 22), (114, 22)]} {'name': 'seq3', 'size': 215, 'p_list': [(100, 22)]} {'name': 'seq3', 'size': 215, 'p_list': [(124, 22)]}
期望输出(每个键对应自身的参数列表):
{'name': 'seq1', 'size': 163, 'p_list': [(124, 22), (114, 22)]} {'name': 'seq2', 'size': 161, 'p_list': [(100, 22)]} {'name': 'seq3', 'size': 215, 'p_list': [(124, 22)]}
解决方法
核心问题是嵌套循环错误遍历了pr的所有值,没有根据key做对应匹配。直接通过当前遍历的key从pr中获取对应值即可:
修正后的代码
for key, val in r.items(): # 通过key直接获取pr中对应的参数列表 p_list = pr[key] print({'name': key, 'size': len(val), 'p_list': p_list})
运行结果
{'name': 'seq1', 'size': 163, 'p_list': [(124, 22), (114, 22)]} {'name': 'seq2', 'size': 161, 'p_list': [(100, 22)]} {'name': 'seq3', 'size': 215, 'p_list': [(124, 22)]}
容错处理(可选)
如果r中存在pr没有的键,直接用pr[key]会抛出KeyError,可以改用get方法返回默认空列表:
for key, val in r.items(): p_list = pr.get(key, []) print({'name': key, 'size': len(val), 'p_list': p_list})
内容的提问来源于stack exchange,提问作者bhumm
相关产品推荐
相关产品推荐

