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

如何将Python中的if-elif代码块重构为Pythonic字典?

我代码里有这么一段冗长的if-elif-else代码块:

if counted == 2:
    score = None

elif counted == 1:
    score = (sum(values) - 3) / 6 * 100

elif counted == 0:
    score = (sum(values) - 4) / 8 * 100

else:
    raise Exception('Should not be reached!')

我想在Python里用dict来重构这段逻辑,用counted的值作为键,但字典的值该怎么设计?新出的case表达式不在考虑范围内,不管它有没有纳入标准库,我都觉得这种写法不够Pythonic。

方案A
# 方案A
mydict = {
    0: ((sum(values) - 4) / 8 * 100),
    1: ((sum(values) - 3) / 6 * 100),
    2: None
}

print(mydict)
print(mydict[counted])

这里的问题是所有字典项都会被提前执行,实际运行后会输出类似这样的结果:

{0: 4625.0, 1: 6183.333333333334, 2: None}
方案B
mydict = {
    0: (lambda _: (sum(values) - 4) / 8 * 100),
    1: (lambda _: (sum(values) - 3) / 6 * 100),
    2: (lambda _: None)
}

print(mydict)
print(mydict[counted](None))

这里我不得不传一个没用的伪参数,好像定义lambda的时候必须这么写才行。实际运行输出示例:

{0: <function <lambda> at 0x7ff8f3dce040>, 1: <function <lambda> at 0x7ff8f3b6a670>, 2: <function <lambda> at 0x7ff8f3b6a700>}

有没有其他更合适的实现方式?

完整可运行示例(MWE)
#!/usr/bin/env python3
import random

values = random.choices(range(100), k=10)
counted = random.choice(range(3))

print(f'counted={counted}')

if counted == 2:
    score = None

elif counted == 1:
    score = (sum(values) - 3) / 6 * 100

elif counted == 0:
    score = (sum(values) - 4) / 8 * 100

else:
    raise Exception('Should not be reached!')

print(f'score={score}')

# 方案A
mydict = {
    0: ((sum(values) - 4) / 8 * 100),
    1: ((sum(values) - 3) / 6 * 100),
    2: None
}

print(mydict)
print(mydict[counted])

# 方案B
mydict = {
    0: (lambda _: (sum(values) - 4) / 8 * 100),
    1: (lambda _: (sum(values) - 3) / 6 * 100),
    2: (lambda _: None)
}

print(mydict)
print(mydict[counted](None))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 18:01:23