假设整数的三个非重叠的数值范围(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)',范围是半开放的。 –