2016-01-20 147 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

也谢谢你的回答。完美无缺地工作。 –