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

Python中使用or/and实现字典多键映射同值为何不符合预期

问题原理说明

Python中or、and为逻辑运算符,运算时仅返回参与运算的某一个操作数,不会生成多key组合,运算规则如下:

  • 对a or b:若a的布尔判断结果为真,直接返回a,否则返回b
  • 对a and b:若a的布尔判断结果为真,直接返回b,否则返回a

所有非空字符串的布尔判断结果均为真,因此你测试的两种写法实际生成的字典结构和预期完全不同:

  1. 用or的场景:'yes' or 'maybe'直接返回'yes',最终字典为{'yes': 200, 'no': 100},访问'maybe'自然触发KeyError
  2. 用and的场景:'yes' and 'maybe'直接返回'maybe',最终字典为{'maybe': 200, 'no': 100},访问'yes'会触发KeyError
多key映射同值的实现方案

方案1:直接重复赋值(适合少量同值key的场景)

test = {}
test['yes'] = test['maybe'] = 200
test['no'] = 100

方案2:字典推导式批量生成(适合同值key数量较多的场景)

# 先定义所有映射到200的key
keys_for_200 = ['yes', 'maybe']
test = {k: 200 for k in keys_for_200}
test['no'] = 100

方案3:自定义字典类(支持更简洁的多key赋值语法)

如果需要更接近预期的声明式写法,可以继承内置字典类做自定义扩展:

from collections import UserDict

class MultiKeyDict(UserDict):
    def __setitem__(self, key, value):
        # 如果传入的key是元组,就遍历元组内所有元素作为独立key赋值
        if isinstance(key, tuple):
            for k in key:
                super().__setitem__(k, value)
        else:
            super().__setitem__(key, value)

# 使用示例
test = MultiKeyDict()
test[('yes', 'maybe')] = 200
test['no'] = 100

测试结果完全符合预期:

print(test['yes'])   # 输出200
print(test['maybe']) # 输出200
print(test['no'])    # 输出100

内容的提问来源于stack exchange,提问作者Wesley Cheek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 22:06:04