2017-08-12 19 views
0

什麼是不使用許多if語句編碼pythonicly的最佳方式?最優雅的方式來檢查數字是否在範圍列表中,並輸出一個值

如果我有例如3個範圍: 1至5給出了 'A' 回 6至10給出了 'B' 回 11至15給出了 'C' 後面

我要檢查,如果一個數量在這些範圍內,然後給我相關的價值。

考慮使用xranges字典作爲鍵的值。

dic = {xrange(1,5) : 'A', 
     xrange(6,10) : 'B', 
     xrange(11, 15) : 'C'} 

def test(my_num): 
    for key, val in dic.items(): 
     if my_num in key: 
      return val 

test(8) 

任何想法?

回答

0

停!在做這件事之前想一想。當你必須對字典進行線性操作的時候,你知道你做錯了什麼。

存儲範圍的鍵失敗了詞典的目的,因爲它需要線性遍歷和成員測試,兩者都是線性的。

最簡單(也是最有效)的方法是簡單地解開你的範圍。事情是這樣的:

In [214]: ranges = [(xrange(1,5), 'A'), 
    ...:  (xrange(6,10),'B'), 
    ...:  (xrange(11, 15), 'C')] 

In [216]: dic = {} 

In [217]: for r, label in ranges: 
    ...:  dic.update({i : label for i in r}) 

你的查詢應該是這樣的:

{1: 'A', 
2: 'A', 
3: 'A', 
4: 'A', 
6: 'B', 
7: 'B', 
8: 'B', 
9: 'B', 
11: 'C', 
12: 'C', 
13: 'C', 
14: 'C'} 

和查找,現在恆一次。

0

我同意@COLDSPEED。這是存儲該數據的低效方式。如果可能的話,你可以用不同的方法回去組裝dic。作爲補充,您可以使用雙重理解來重寫它。你不會經常看到這些,但在這裏可能適合。

lookup = { 
    value: label for range, value in dic.items for value in range 
} 
相關問題