有没有更好的方法来编写这个“如果”布尔评估?

时间:2012-11-27 17:31:56

标签: python if-statement

我写了一小段python代码。它有效,但我认为应该有一个更简化的方法来实现相同的结果。我只是没有看到它。有什么想法吗?

if tx_avt >= 100: tx = 1 
elif tx_avt < 100 and tx_avt >= 50: tx = 2 
elif tx_avt < 50 and tx_avt >= 25: tx = 3
elif tx_avt < 25 and tx_avt >= 12.5: tx = 4 
else: tx = 5

5 个答案:

答案 0 :(得分:29)

您可以将其更改为:

if tx_avt >= 100: tx = 1 
elif tx_avt >= 50: tx = 2 
elif tx_avt >= 25: tx = 3
elif tx_avt >= 12.5: tx = 4 
else: tx = 5

<强>解释

  • 如果if tx_avt >= 100不成立,则可以推断tx_avt < 100 必须为真。
  • 这样就无需在支票“tx_avt < 100”中执行“elif tx_avt < 100 and tx_avt >= 50:”部分。

同样的逻辑下降和适用于elif个案的其余部分。


相关阅读:Why Python Doesn't Have a Switch Statement, and its Alternatives

答案 1 :(得分:10)

你不需要elifs的上限,因为这些都是通过他们上面的条款解决的......

elif tx_avt >= 50 : #do something
elif tx_avt >= 25 : #somthing else

在python的旁注上你可以做到

if 3 < ab < 10 : #check if ab is between 3 and 10

答案 2 :(得分:8)

如果你的if-elif-else链很长,你可以使用这个方法:

for amt, tx in [(100, 1), (50, 2), (25, 3), (12.5, 4)]:
    if tx_avt >= amt:
        break
else:
    tx = 5

注意: else循环的for子句在未遇到break时执行。在这种情况下,它用于提供默认情况。

答案 3 :(得分:3)

为了提出另一个想法,可以使用bisect模块中的二进制搜索功能在单行中完成。

In [106]: def index(a,x):
   .....:         return len(a) - bisect.bisect_right(a, x) + 1
   .....:

In [107]: a=[12.5,25,50,100]

In [108]: index(a,15)
Out[108]: 4

In [109]: index(a,25)
Out[109]: 3

In [110]: index(a,35)
Out[110]: 3

In [111]: index(a,50)
Out[111]: 2

In [112]: index(a,100)
Out[112]: 1

答案 4 :(得分:0)

基于[12.5,25,50,100]这一事实的另一个想法是一系列:

MAX_BOUNDARY = 5
for tx, boundary in [(n, 25 * 2**(-n+3)) for n in range(1, MAX_BOUNDARY)]:
    if tx_avt >= boundary:
        break
else:
    tx = MAX_BOUNDARY

(这是稍微修改过@StevenRumbalski版本)

如果tx_avt的分布是统一的(w.r.t.系列函数)并且你的列表变得非常大,那么这可以与@WaiYipTung关于bisect for O(log(n))搜索的想法结合起来。

否则你应该坚持使用@JoranBeasley和@SampsonChen建议的更简单易懂的解决方案。