Вместо использования OrderedDict и bisect рассмотрим тип SortedDict в модуле sortedcontainers . Это реализация на чистом Python и fast-as-C отсортированного списка, отсортированного dict и отсортированного набора типов со 100% охватом тестирования и часами стресса.
С помощью SortedDict вы можете разделить пополам нужный ключ. Например:
from itertools import islice
from sortedcontainers import SortedDict
def closest(sorted_dict, key):
"Return closest key in `sorted_dict` to given `key`."
assert len(sorted_dict) > 0
keys = list(islice(sorted_dict.irange(minimum=key), 1))
keys.extend(islice(sorted_dict.irange(maximum=key, reverse=True), 1))
return min(keys, key=lambda k: abs(key - k))
Функция closest
использует SortedDict.irange для создания итератора ключей, ближайшего к данному ключу. Ключи разделены пополам с log(N)
сложность времени выполнения.
>>> sd = SortedDict({-3: 'a', 0: 'b', 2: 'c'})
>>> for num in range(-5, 5):
... key = closest(sd, num)
... print('Given', num, ', closest:', key)
Given -5 , closest: -3
Given -4 , closest: -3
Given -3 , closest: -3
Given -2 , closest: -3
Given -1 , closest: 0
Given 0 , closest: 0
Given 1 , closest: 2
Given 2 , closest: 2
Given 3 , closest: 2
Given 4 , closest: 2
Это Pythonic использовать PyPI!