is this sort method the same as the one in python 2.4

Lowell Kirsh lkirsh at cs.ubc.ca
Sun Jan 30 22:56:36 CET 2005


How come you reverse the list twice? And why does this preserve stability?

Raymond Hettinger wrote:
> "Lowell Kirsh"
> 
>>I'm trying to emulate the sorted() method introduced in python 2.4. The
>>only difference is that it takes a sequence as one of its arguments
>>rather than being a method of the sequence class. Does my method do the
>>same as the sorted()?
> 
> 
> Almost.  This is closer to the mark:
> 
> def sorted(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
> 
> 
> Try it against the tests in Lib/test/test_builtin.py.
> 
> The differences from your version:
> * >= 2.4 rather than just > 2.4
> * renamed the parameter to iterable
> * handle the case where both cmp and key are defined
> * add an enumerated tie breaker to prevent full key comparisons
> * preserve by using reverse twice
> 
> The real sorted() does the same thing but is implemented a bit differently.  A
> custom key wrapper is applied to each object so that only the key value gets
> compared (no need for a full tuple with a tie breaker value).
> 
> Raymond Hettinger
> 
> 
> 



More information about the Python-list mailing list