2012-11-27 68 views
12

我有我寫的這段python代碼的小片段。它的工作原理,但我認爲應該有一個更簡化的方法來實現相同的結果。我只是沒有看到它。有任何想法嗎?有沒有更好的方法來編寫這個「if」布爾評估?

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

如果您正確縮進分配到自己的行,這將更具可讀性。 –

回答

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必須是真實的。
  • 這消除了在檢查「elif tx_avt < 100 and tx_avt >= 50:」中執行「tx_avt < 100」部分的需要。

同樣的邏輯落下下來&適用於的elif案件其餘部分。


相關閱讀:Why Python Doesn't Have a Switch Statement, and its Alternatives

+2

迄今爲止最完整的答案! – heltonbiker

+0

當然啊!現在對我來說很明顯!出於某種原因,我把它放在我的腦海裏,我必須用AND語句在數字之間進行評估。感謝您的澄清。理想情況下,如果我使用C++,我會使用switch/case語句。更乾淨。所以去吧。我會檢查鏈接。 – DavidScott612

10

你不需要在elifs的上限,因爲這些都是由上述這些條款解決...

elif tx_avt >= 50 : #do something 
elif tx_avt >= 25 : #somthing else 
在蟒蛇一個側面說明

你可以做

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

間隔檢查是interresting!你知道它在語言參考中的位置嗎?希望看到如何評估其他類型比整數 –

+2

有一點在這裏的第一段http://docs.python.org/2/reference/expressions.html#not-in –

+0

啊,這是一個有趣的消息我不瞭解Pyhton。謝謝! – DavidScott612

8

如果你的如果 - elif的,否則鏈變得很長,你可以使用這個方法:

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

注:break尚未遇到時,將執行for循環的else子句。在這種情況下,它用於提供默認情況。

+0

你的註釋有點不對......如果你在退出循環時不在if或elif塊中,則執行else ... –

+1

@JoranBeasley:錯誤。看Python文檔[4.4。 'break'和'continue'語句,以及循環中的'else'子句](http://docs.python.org/2/tutorial/controlflow.html#break-and-continue-statements-and-else-clauses-循環語句):「循環語句可以有一個'else'子句;當循環通過列表(用'for')結束或者當條件變爲假(用'while')時,它被執行,但是當該循環由「break」語句終止。「 –

+0

哦很酷謝謝:) ...我以爲這些執行不同,但很好知道 –

3

爲了給出另一個想法,可以使用二分查找模塊中的二進制搜索功能在一個班輪中完成此操作。

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 
+2

+1。不要忘記處理默認情況。 –

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版本)

這可能結合@WaiYipTung關於bisect的想法用於O(log(n))搜索,如果tx_avt的分佈是一致的(wrt序列函數)並且你的列表增長非常大。

否則,你應該堅持更簡單和易於理解的解決方案,如@JoranBeasley和@SampsonChen建議。

相關問題