如何将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
相关产品推荐
相关产品推荐

