You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修正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

这段代码的执行流程是:

  1. 取第一个字典{100:1,...70:4},遍历listo的所有键:70(找到4)、80(找到3)、105(找不到)→ track变成[4,3]
  2. 取第二个字典{100:1,...80:3},遍历listo的所有键:70(找不到)、80(找到3)、105(找不到)→ track变成[4,3,3]
  3. 取第三个字典{105:1,...80:4},遍历listo的所有键:70(找不到)、80(找到4)、105(找到1)→ track变成[4,3,3,4,1]

这就是你得到错误结果的原因——循环逻辑是“每个字典匹配所有键”,而不是“对应位置的字典匹配对应位置的键”。

内容的提问来源于stack exchange,提问作者Mahir Islam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:20:08