如何实现字典键值双向匹配查询?及姓名邮箱字典高效查询方法
问题1:双向查找字典的键与值
要实现输入为键时返回对应值、输入为值时返回对应键的功能,核心是做双向匹配,需注意字典的值可能存在重复,以下分两种场景实现:
场景1:字典值唯一的情况
如果能保证所有值不重复,可直接生成反向字典来快速匹配:
def bidirectional_lookup(original_dict, input_val): # 生成反向字典:值作为键,原键作为对应值 reverse_dict = {v: k for k, v in original_dict.items()} # 先判断输入是否为原字典的键 if input_val in original_dict: return original_dict[input_val] # 再判断输入是否为原字典的值 elif input_val in reverse_dict: return reverse_dict[input_val] # 都不匹配时返回提示 else: return "输入内容不在字典的键或值中" # 测试示例 test_dict = {"cat": "宠物", "rice": "主食", "oak": "植物"} print(bidirectional_lookup(test_dict, "cat")) # 输出:宠物 print(bidirectional_lookup(test_dict, "主食")) # 输出:rice
场景2:字典值存在重复的情况
如果多个键对应同一个值,需要返回所有匹配的键:
def bidirectional_lookup_multi(original_dict, input_val): # 输入为键时直接返回对应值 if input_val in original_dict: return original_dict[input_val] # 输入为值时,收集所有匹配的键 else: matching_keys = [k for k, v in original_dict.items() if v == input_val] return matching_keys if matching_keys else "输入内容不在字典的键或值中" # 测试示例 test_dict = {"apple": "水果", "orange": "水果", "spinach": "蔬菜"} print(bidirectional_lookup_multi(test_dict, "水果")) # 输出:['apple', 'orange']
问题2:姓名-邮箱的高效查询
用字典存储姓名与邮箱时,直接将姓名作为字典的键、邮箱作为对应值就是最高效的实现方式——字典的键查找是O(1)时间复杂度,远快于循环遍历的O(n),且代码简洁易维护。
实现示例
# 初始化姓名-邮箱字典 name_email_map = { "Alice": "alice@example.com", "Bob": "bob@example.com", "Charlie": "charlie@example.com" } # 查询函数 def get_email(name): # 用get方法避免键不存在时抛出异常,返回自定义提示 return name_email_map.get(name, "未找到该姓名对应的邮箱") # 测试 print(get_email("Bob")) # 输出:bob@example.com print(get_email("David")) # 输出:未找到该姓名对应的邮箱
这种方式的优势:
- 查找效率极高,数据量越大,对比循环的优势越显著
- 新增、删除或修改记录时,直接操作字典即可,无需调整逻辑
内容的提问来源于stack exchange,提问作者Aharon Becker
相关产品推荐
相关产品推荐

