在Python中使用范围作为字典索引

n10*_*000 5 python dictionary

有可能做这样的事情:

r = {range(0, 100): 'foo', range(100, 200): 'bar'}

print r[42]

> 'foo'
Run Code Online (Sandbox Code Playgroud)

所以我想使用数值范围作为字典索引的一部分.为了使事情变得更复杂,我还想使用多索引('a', range(0,100)).所以这个概念应该理想地扩展到那个.有什么建议?

这里也提出了类似的问题,但我对全面实施感兴趣,而不是该问题的不同方法.

sty*_*ane 5

如果您使用的是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__方法。


Mar*_*ans 5

作为替代方法,如果您尝试查找与某些范围关联的值,您可以使用内置的 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)


B5-*_*DDT 3

您只能使用不可变数据类型作为键。所以没有列表。

但是您可以使用元组来定义上限和下限。

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)

但我承认你不需要字典。