3

我有一个带有浮点数作为键和对象作为值的字典。我收到一个浮点数,我想知道这个浮点数在两个键之间。我怎么找到这个?

我在代码中的意思示例:

a = {}
a[1.2] = some_unimportant_instance
a[2.3] = some_other_unimportant_instance
a[2.6] = some_third_unimportant_instance
etc...

r = 2.5
# a[r] will not work
# I want something that returns the two numbers around r
# in this case, 2.3 and 2.6.
4

3 回答 3

7

第一个观察:dict-s 对此不利。它们是使用散列实现的,并且仅用于检索完全匹配的值。出于您的目的,您必须首先将 dict 转换为键列表。然后,您可以使用 bisect 等模块。

例子:

import bisect
keys = sorted(a.keys())
index = bisect.bisect(keys, r)
if index >= 1:
    print keys[index - 1]
print keys[index]

更新:按照 Mark Dickinson 的建议改进了代码。谢谢!

于 2012-04-13T11:58:00.880 回答
4

使用PyPI是 Pythonic 。有许多 MutableMapping 类型以排序顺序维护键并支持您想要的二等分和索引。考虑具有SortedDict类型的sortedcontainers模块正是为了这个目的。

from sortedcontainers import SortedDict
sd = SortedDict((key, value) for key, value in data)

# Get the would-be index of the desired key.
index = sd.bisect(2.5)

# Get the actual key at that index.
key = sd.iloc[index]

# Look ahead one to find the range.
ahead = sd.iloc[index + 1]

sortedcontainers 也是纯 Python,与 2.6 到 3.4 兼容,具有 100% 的测试覆盖率和数小时的压力,并且有一个基准比较表明它非常快(快如 C 实现一样快)。

于 2014-04-10T19:19:55.773 回答
0

要实际返回这两个键,请考虑:

def surrounding_keys(needle, haystack):
    if haystack: # ensure it's not empty
        keys = sorted(haystack.keys())
        for (lower, upper) in zip(keys, keys [1:]):
            if lower < needle < upper:
                return (lower, upper)
    raise KeyError # fails with key error if: not found, empty dict, dict with only one key
于 2012-04-13T17:13:23.367 回答