作为简化示例,假设我有以下if语句
if x > 5:
score = 1
else if x <= 5
score = 2
如何用字典替换它?我想要像
这样的东西score = {x > 5: 1, x <= 5: 2}[x]
我的if语句很长,所以我想使用这个简洁的结构。
答案 0 :(得分:2)
您可以使用元组列表而不是字典,其中一个项是函数,另一个是值。循环遍历列表,调用每个函数;当函数返回truthy值时,返回相应的值。
def greater_than_5(x):
return x > 5
def less_or_equal_5(x):
return x <= 5
scores = [(greater_than_5, 1), (less_or_equal_5, 2)]
for f, val in scores:
if f(x):
score = val
break
答案 1 :(得分:0)
使用if-else将是最易读的解决方案。此外,它还避免了一个问题,即您需要无限量的值来表达x > 5
之类的字典(因为它将映射从6开始的所有数字)。
只有当您知道域名有限时(例如,x始终小于1000),它才会起作用。简单的if语句很可能会更快。
要表达范围,您可以使用以下简短表示法:
if 4 <= x <= 10:
...
如果你有一个非常复杂的公式(许多if-else语句)和有限数量的值,使用预先计算的表是有意义的。如果编译器在值很密集时必须使用C语言翻译复杂的switch-case语句,那么编译器也会这样做。他们将其实现为查找表。
我仍然建议首先将公式编写为if-else语句,然后使用根据if-else代码和可能值范围计算字典的函数。要填充字典,请迭代可能的值范围:
def score(x):
if x > 5:
return 1
elif x <= 5:
return 2
...
d = dict((i,foo(i)) for i in range(1,100))
d[x]