有可能做这样的事情:
r = {range(0, 100): 'foo', range(100, 200): 'bar'}
print r[42]
> 'foo'
Run Code Online (Sandbox Code Playgroud)
所以我想使用数值范围作为字典索引的一部分.为了使事情变得更复杂,我还想使用多索引('a', range(0,100)).所以这个概念应该理想地扩展到那个.有什么建议?
这里也提出了类似的问题,但我对全面实施感兴趣,而不是该问题的不同方法.
如果您使用的是Python 3.x,则可以将range对象用作键,但是要检索值,您将执行以下操作:
In [33]: r = {range(0, 100): 'foo', range(100, 200): 'bar'}
In [34]: { r[key] for key in r if 42 in key}
Out[34]: {'foo'}
Run Code Online (Sandbox Code Playgroud)
在Python2.x中无法执行此操作的原因是,从range2.7版开始,该函数将返回一个列表,并且列表不能用作字典键,因为它们不提供有效的__hash__方法。
作为替代方法,如果您尝试查找与某些范围关联的值,您可以使用内置的 Pythonbisect库,如下所示:
import bisect
def boundaries(num, breakpoints=[100, 200], result=['foo', 'bar']):
i = bisect.bisect(breakpoints, num-1)
return result[i]
print boundaries(42)
Run Code Online (Sandbox Code Playgroud)
这将显示:
foo
Run Code Online (Sandbox Code Playgroud)
您只能使用不可变数据类型作为键。所以没有列表。
但是您可以使用元组来定义上限和下限。
r = {(0,100): 'foo', (100,200): 'bar'}
Run Code Online (Sandbox Code Playgroud)
我会这样得到 42 的值:
res = ""
for (k1,k2) in r:
if (k1 < 42 and k2 > 42):
res = r[(k1,k2)]
print(res)
Run Code Online (Sandbox Code Playgroud)
但我承认你不需要字典。