嵌套字典(dict)搜索异常:仅匹配键不匹配值的原因及修复方案
问题分析与修复方案
首先,先明确你的核心问题:不是for key, value in addressBook.items()没有遍历值,而是你的代码逻辑在遇到第一个不匹配的联系人时就直接终止了搜索,根本没机会检查后面的条目。
我们来拆解你的代码逻辑问题:
- 你在遍历每个联系人的循环里,一旦当前联系人不匹配搜索字符串,就执行
else分支,打印"未找到"并return,这会直接跳出整个函数,后面的联系人(比如Chris)完全没被检查到。 - 比如你搜索"Lang"时,第一个遍历到的是Jim的条目,显然不匹配,代码就直接进入else,打印没找到并返回,根本不会去看Chris的信息。
修复后的代码
我们需要先收集所有匹配的联系人,遍历完整个地址簿后再统一处理结果:
def searchAllFields(addressBook): searchString = input("Enter a string to search for (enter to cancel): ") if searchString == "": return # 先收集所有匹配的联系人 matches = [] for key, contact in addressBook.items(): # 检查键是否匹配 if searchString in key: matches.append(contact) continue # 检查所有字段值是否匹配 for field_value in contact.values(): if searchString in field_value: matches.append(contact) break # 找到匹配就不用再检查当前联系人的其他字段了 # 遍历完所有联系人后处理结果 if matches: print("The following contacts were found: ") for contact in matches: print(contact['name']) print(contact['address']) print(contact['phone'] + '\n') else: print(f"No contact matching the string {searchString} was found.")
关键改动说明
- 收集匹配结果而非即时判断:用
matches列表存储所有符合条件的联系人,确保遍历完整个地址簿的所有条目。 - 优化匹配逻辑:先检查键,再检查每个字段值,找到匹配就加入列表并跳过当前联系人的其他字段,提升效率。
- 统一结果输出:遍历完成后再根据
matches是否为空决定输出内容,避免提前终止函数。
验证你的测试场景
- 搜索"Jim":会匹配到键"Jim",加入结果列表,输出James的信息。
- 搜索"Lang":遍历到Chris的条目时,
address字段包含"Lang",会被加入结果列表,最终输出Chris的信息。
内容的提问来源于stack exchange,提问作者Jim421616
相关产品推荐
相关产品推荐

