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

列表嵌套字典查找值失败,始终输出‘Not found’的问题排查

问题:Python嵌套字典查找始终返回“Not found”

我需要实现从列表嵌套的字典中检查值是否存在,若存在则打印对应值。但编写的代码无论输入什么内容,都无法找到对应的字典条目,始终输出‘Not found’,问题出在for entry in iso3166_1:开始的循环部分:

iso3166_1 = [
  {
    "name_en": "Afghanistan",
    "name_fr": "Afghanistan (l')",
    "full_name": "the Islamic Republic of Afghanistan",
    "alpha2": "AF",
    "alpha3": "AFG",
    "numeric": "004",
    "independent": "Yes"
  },
  {
    "name_en": "Åland Islands",
    "name_fr": "Åland(les Îles)",
    "full_name": "N/A",
    "alpha2": "AX",
    "alpha3": "ALA",
    "numeric": "248",
    "independent": "No"
  },
  {
    "name_en": "Albania",
    "name_fr": "Albanie (l')",
    "full_name": "the Republic of Albania",
    "alpha2": "AL",
    "alpha3": "ALB",
    "numeric": "008",
    "independent": "Yes"
  }
]

print("Are you looking for an existing country, subdivision, or former country? Type 1, 2, or 3 for that option.")
user_input = input()

if user_input == "1":
  print("Enter the name or code of a country.")
  lookup = str.lower(input())
  if lookup == "N/A":
    print("'N/A' is present in too many entries to list.")
  else:
    for entry in iso3166_1:
      for i in entry:
        if lookup == i:
          found_lookup = True
          dict = iso3166_1.index(entry)
          name_en = iso3166_1[iso3166_1.index(entry)]["name_en"]
          print(f"Short-form English name: {name_en}")
        else:
          print("Not found.")

问题分析

  1. 遍历对象错误:for i in entry遍历的是字典的键(如name_en、alpha2),而你要查找的是字典的值(如Afghanistan、AF),所以永远匹配不上输入内容。
  2. 错误的提示时机:当前代码每遍历一个不匹配的键就打印一次“Not found”,导致无论是否有匹配结果,都会重复输出该提示。
  3. 冗余的索引操作:不需要用iso3166_1.index(entry)获取索引,直接通过entry["name_en"]就能拿到对应值,效率更低。
  4. 未初始化标记变量:found_lookup没有提前定义,可能引发未定义错误。

修复后的代码

iso3166_1 = [
  {
    "name_en": "Afghanistan",
    "name_fr": "Afghanistan (l')",
    "full_name": "the Islamic Republic of Afghanistan",
    "alpha2": "AF",
    "alpha3": "AFG",
    "numeric": "004",
    "independent": "Yes"
  },
  {
    "name_en": "Åland Islands",
    "name_fr": "Åland(les Îles)",
    "full_name": "N/A",
    "alpha2": "AX",
    "alpha3": "ALA",
    "numeric": "248",
    "independent": "No"
  },
  {
    "name_en": "Albania",
    "name_fr": "Albanie (l')",
    "full_name": "the Republic of Albania",
    "alpha2": "AL",
    "alpha3": "ALB",
    "numeric": "008",
    "independent": "Yes"
  }
]

print("Are you looking for an existing country, subdivision, or former country? Type 1, 2, or 3 for that option.")
user_input = input()

if user_input == "1":
  print("Enter the name or code of a country.")
  lookup = input().lower()
  if lookup == "n/a":
    print("'N/A' is present in too many entries to list.")
  else:
    found_lookup = False
    for entry in iso3166_1:
      # 遍历字典的所有值,统一转小写实现大小写不敏感匹配
      for value in entry.values():
        if lookup == str(value).lower():
          found_lookup = True
          print(f"Short-form English name: {entry['name_en']}")
          break  # 找到当前条目的匹配值后,跳出内层循环
      if found_lookup:
        break  # 找到目标后,跳出外层循环停止遍历
    # 所有条目检查完成后,再判断是否未找到
    if not found_lookup:
      print("Not found.")

关键修改点

  • 替换遍历对象:将for i in entry改为for value in entry.values(),遍历字典的值而非键。
  • 统一大小写:把输入和字典值都转成小写,确保大小写不敏感匹配。
  • 调整提示时机:初始化found_lookup标记,所有条目遍历完成后再判断是否输出“Not found”,避免重复提示。
  • 简化取值操作:直接用entry["name_en"]获取国家英文名,无需通过索引查找。
  • 优化遍历效率:找到匹配值后跳出循环,避免不必要的遍历。

内容的提问来源于stack exchange,提问作者CJ HANSON

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 08:00:31