Problem with the sort() function

Scott David Daniels Scott.Daniels at Acm.Org
Tue Feb 22 10:40:24 EST 2005


Nick Coghlan wrote:
> 
> def mysort(iterable, cmp=None, key=None, reverse=False):
>     "return a sorted copy of its input"
>     if sys.version_info >= (2,4):
>         return sorted(iterable, cmp, key, reverse)
>     seq = list(iterable)
>     if reverse:
>         seq.reverse()        # preserve stability
>     if key is not None:
>         seq = [(key(elem), i, elem) for i, elem in enumerate(seq)]
>     seq.sort(cmp)
>     if key is not None:
>         seq = [elem for (key, i, elem) in seq]
>     if reverse:
>         seq.reverse()
>     return seq
> 

You'd be better off defining things once (and using the standard name)
rather than doing a test every time your function is called.
Something like:

     import sys
     ...
     if sys.version_info < (2, 3):
         def enumerate(iterable): # iterators not yet invented
             return zip(range(len(iterable)), iterable)

     if sys.version_info < (2, 4):
         def sorted(iterable, cmp=None, key=None, reverse=False):
             "return a sorted copy of its input"
             seq = list(iterable)
             if reverse:
                 seq.reverse()        # preserve stability
             if key is not None:
                 seq = [(key(elem), i, elem) for i, elem
                        in enumerate(seq)]
                 seq.sort(cmp)
             if key is not None:
                 seq = [elem for (key, i, elem) in seq]
             if reverse:
                 seq.reverse()
             return seq

If you like your names better, you can use:

     if sys.version_info >= (2, 4):
         mysort = sorted
     else:
         def mysort(iterable, cmp=None, key=None, reverse=False):
             ...

or even (if you can't be bothered to look up when features happened):

     try:
         test = enumerate
     except NameError:
         def enumerate(iterable):
             ...
     try:
         test = sorted
     except NameError:
         def sorted(iterable, cmp=None, key=None, reverse=False):
             ...


--Scott David Daniels
Scott.Daniels at Acm.Org



More information about the Python-list mailing list