В параметрах bisect
и insort
может быть несогласованность параметров, или вам придется передавать значение, а не ключ, для поиска. В любом случае кого-то ожидает неприятный сюрприз.
То есть либо
def insort(a, x, lo=0, hi=None, *, key=None):
lo = bisect(a, x, lo, hi, key)
a.insert(lo, x)
def bisect(a, x, lo=0, hi=None, *, key=None):
if lo < 0:
raise ValueError('lo must be non-negative')
if hi is None:
hi = len(a)
if key is None:
key = lambda x: x
while lo < hi:
mid = (lo+hi)//2
if key(x) < key(a[mid]): hi = mid
else: lo = mid+1
return lo
>>> key=lambda r: r[1]
>>> insort(data, ('green', 3), key=key)
>>> bisect(data, 7, key=key) # error comparing tuple to int
, либо альтернативно
def insort(a, x, lo=0, hi=None, *, key=None):
if key is None:
key = lambda x: x
lo = bisect(a, key(x), lo, hi, key)
a.insert(lo, x)
def bisect(a, x, lo=0, hi=None, *, key=None):
if lo < 0:
raise ValueError('lo must be non-negative')
if hi is None:
hi = len(a)
if key is None:
key = lambda x: x
while lo < hi:
mid = (lo+hi)//2
if x < key(a[mid]): hi = mid
else: lo = mid+1
return lo
>>> key=lambda r: r[1]
>>> item = ('green', 3)
>>> insort(data, item, key=key)
>>> bisect(data, item, key=key) # error comparing int to tuple