[Python-ideas] Optional key to `bisect`'s functions?

Arnaud Delobelle arnodel at gmail.com
Thu Feb 9 15:27:20 CET 2012

On 9 February 2012 00:25, Guido van Rossum <guido at python.org> wrote:
> Basically Raymond says "bisect can call the key() function many times, which
> leads to bad design". His alternative, to use a list of (key, value) tuples,
> is often a bit clumsy when passing the sorted list to another function (e.g.
> for printing); having to transform the list using e.g. [v for (k, v) in a]
> feels clumsy and suboptimal.

Also, in Python 3 one can't assume that values will be comparable so
the (key, value) tuple trick won't work: comparing the tuples may well
throw a TypeError.  Here's a simple example below.  The class 'Person'
has no natural order, but we may want to keep a list of people sorted
by iq:

>>> class Person:
...     def __init__(self, height, iq):
...         self.height = height
...         self.iq = iq
>>> arno = Person(184, 101)
>>> guido = Person(179, 185)
>>> steve = Person(168, 101)
>>> key = lambda p: p.iq
>>> people = []
>>> bisect.insort(people, (key(arno), arno))
>>> bisect.insort(people, (key(guido), guido))
>>> bisect.insort(people, (key(steve), steve))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unorderable types: Person() < Person()


More information about the Python-ideas mailing list