如何修正Python代码实现列表与字典按对应位置查找键值
修正Python代码以实现按位置对应查找字典值
你的问题核心是循环逻辑错配了:当前的嵌套循环会遍历dicto里的每一个字典,然后在每个字典中尝试查找listo里的所有键,只要键存在就把值加入track,这就导致了多余的匹配结果。而你需要的是**listo的第n个元素仅查找dicto的第n个字典**,也就是两个序列按索引一一对应。
修正方案:按位置配对遍历
我们可以用zip()函数把dicto和listo打包成一一对应的元组,这样每次循环就能同时拿到对应位置的字典和要查找的键:
dicto = [{100: 1, 90: 2, 80: 3, 70: 4}, {100: 1, 90: 2, 80: 3}, {105: 1, 100: 2, 90: 3, 80: 4}] listo = [70, 80, 105] track = [] # 同时遍历对应位置的字典和键 for d, key in zip(dicto, listo): # 这里假设所有键都存在,如果需要处理键不存在的情况,可以保留try-except track.append(d[key]) print(track) # 输出: [4, 3, 1]
如果想要更简洁的写法,也可以用列表推导式:
track = [d[key] for d, key in zip(dicto, listo)]
为什么原来的代码会出错?
再回头看你的原代码:
for y in dicto: for x in listo: try: track.append(y[x]) except KeyError: pass
这段代码的执行流程是:
- 取第一个字典
{100:1,...70:4},遍历listo的所有键:70(找到4)、80(找到3)、105(找不到)→ track变成[4,3] - 取第二个字典
{100:1,...80:3},遍历listo的所有键:70(找不到)、80(找到3)、105(找不到)→ track变成[4,3,3] - 取第三个字典
{105:1,...80:4},遍历listo的所有键:70(找不到)、80(找到4)、105(找到1)→ track变成[4,3,3,4,1]
这就是你得到错误结果的原因——循环逻辑是“每个字典匹配所有键”,而不是“对应位置的字典匹配对应位置的键”。
内容的提问来源于stack exchange,提问作者Mahir Islam
相关产品推荐
相关产品推荐

