假設整數的三個非重疊的數值範圍(R1,R2和R3)以及一個目標整數我。匹配整數數值範圍在Python
i = 7
ranges = {"r1": [0,4], "r2": [5,8], "r3": [9,10]}
什麼函數將返回我的字典鍵(即數字範圍的名稱)在其範圍內的目標整數下降?
sought_function(i, ranges)
# "r2"
假設整數的三個非重疊的數值範圍(R1,R2和R3)以及一個目標整數我。匹配整數數值範圍在Python
i = 7
ranges = {"r1": [0,4], "r2": [5,8], "r3": [9,10]}
什麼函數將返回我的字典鍵(即數字範圍的名稱)在其範圍內的目標整數下降?
sought_function(i, ranges)
# "r2"
如何列表理解迭代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
例外。您可以處理錯誤,如果您的情況有意義,請提供默認值。
如果範圍可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,11):your_code_here'中的測試。應該注意的是,第一個示例代碼返回一個列表(帶有一個列表項),而第二個示例代碼則返回一個字符串。 (當我在範圍之外時,這兩個示例都會引發錯誤 - 但我意識到這並未在我的問題中指定。) –
「找不到」條件是空的「列表」(第一種情況)和「無」(第二種情況) – mementum
也謝謝你的回答。完美無缺地工作。 –
您的第一個示例代碼雖然非常易讀,但未通過以下測試:'for i in range(0,11):[key for key,(low,high)in ranges.iteritems()if
@MichaelGruenstaeudl你的意思是我應該也包括範圍邊界呢?更新。謝謝。 – alecxe
@MichaelGruenstaeudl,11不在'範圍(0,11)',範圍是半開放的。 –