Python中字典键中的逻辑表达式

时间:2017-06-14 21:27:52

标签: python dictionary

作为简化示例,假设我有以下if语句

if x > 5:
    score = 1
else if x <= 5
    score = 2

如何用字典替换它?我想要像

这样的东西
score = {x > 5: 1, x <= 5: 2}[x]

我的if语句很长,所以我想使用这个简洁的结构。

2 个答案:

答案 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]