is this sort method the same as the one in python 2.4
Lowell Kirsh
lkirsh at cs.ubc.ca
Sun Jan 30 16:56:36 EST 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