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

如何实现字典键值双向匹配查询?及姓名邮箱字典高效查询方法

问题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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 06:18:24