2016-01-20 146 views
0

假設整數的三個非重疊的數值範圍(R1R2R3)以及一個目標整數匹配整數數值範圍在Python

i = 7 
ranges = {"r1": [0,4], "r2": [5,8], "r3": [9,10]} 

什麼函數將返回我的字典鍵(即數字範圍的名稱)在其範圍內的目標整數下降?

sought_function(i, ranges) 
# "r2" 

回答

2

如何列表理解迭代dictionary items和檢查i在範圍內:

>>> i = 7 
>>> ranges = {"r1": [0,4], "r2": [5,8], "r3": [9,10]} 
>>> [key for key, (low, high) in ranges.iteritems() if low <= i <= high] 
['r2'] 

使用iteritems()因爲這個問題被標記爲Python-2.7

如果你只需要第一個值,使用next()

>>> next(key for key, (low, high) in ranges.iteritems() if low <= i <= high) 
'r2' 

需要注意的是,如果沒有匹配的條件值,你會得到StopIteration例外。您可以處理錯誤,如果您的情況有意義,請提供默認值

+0

您的第一個示例代碼雖然非常易讀,但未通過以下測試:'for i in range(0,11):[key for key,(low,high)in ranges.iteritems()if

+0

@MichaelGruenstaeudl你的意思是我應該也包括範圍邊界呢?更新。謝謝。 – alecxe

+0

@MichaelGruenstaeudl,11不在'範圍(0,11)',範圍是半開放的。 –

1

如果範圍可repated /重疊

iranges = [x for x, r in ranges.items() if r[0] <= i <= r[1]] 

如果只能有一個或無

irange = next((x for x, r in ranges.items() if r[0] <= i <= r[1]), None) 

items爲您提供了與Python 3兼容...你需要它

+0

你的兩個示例代碼通常都會通過'我在範圍(0,11):your_code_here'中的測試。應該注意的是,第一個示例代碼返回一個列表(帶有一個列表項),而第二個示例代碼則返回一個字符串。 (當我在範圍之外時,這兩個示例都會引發錯誤 - 但我意識到這並未在我的問題中指定。) –

+0

「找不到」條件是空的「列表」(第一種情況)和「無」(第二種情況) – mementum

+0

也謝謝你的回答。完美無缺地工作。 –