列表嵌套字典查找值失败,始终输出‘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.")
问题分析
- 遍历对象错误:
for i in entry遍历的是字典的键(如name_en、alpha2),而你要查找的是字典的值(如Afghanistan、AF),所以永远匹配不上输入内容。 - 错误的提示时机:当前代码每遍历一个不匹配的键就打印一次“Not found”,导致无论是否有匹配结果,都会重复输出该提示。
- 冗余的索引操作:不需要用
iso3166_1.index(entry)获取索引,直接通过entry["name_en"]就能拿到对应值,效率更低。 - 未初始化标记变量:
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
相关产品推荐
相关产品推荐

