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