12

我有我写的一小段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
4

5 回答 5

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情况。


相关阅读:为什么 Python 没有 Switch 语句及其替代方案

于 2012-11-27T17:34:11.897 回答
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
于 2012-11-27T17:34:45.427 回答
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子句在没有遇到时执行。在这种情况下,它用于提供默认情况。forbreak

于 2012-11-27T17:36:07.303 回答
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
于 2012-11-27T18:53:13.167 回答
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 版本)

bisect如果 tx_avt 的分布是均匀的(wrt 系列函数)并且您的列表变得非常大,这可以与 @WaiYipTung 关于O(log(n)) 搜索的想法相结合。

否则,您应该坚持使用@JoranBeasley 和@SampsonChen 建议的更简单、更容易理解的解决方案。

于 2012-11-27T19:20:01.560 回答