copysort patch, was RE: [Python-Dev] inline sort option

Alex Martelli aleaxit at yahoo.com
Mon Oct 20 17:56:30 EDT 2003


On Monday 20 October 2003 11:43 pm, Raymond Hettinger wrote:
> Let's see what the use cases look like under the various proposals:
>
>   todo = [t for t in tasks.copysort() if due_today(t)]
>   todo = [t for t in list.sorted(tasks) if due_today(t)]
>   todo = [t for t in list(tasks, sorted=True) if due_today(t)]
>
>   genhistory(date, events.copysort(key=incidenttime))
>   genhistory(date, list.sorted(events, key=incidenttime))
>   genhistory(date, list(events, sorted=True, key=incidenttime))
>
>   for f in os.listdir().copysort(): . . .
>   for f in list.sorted(os.listdir()): . . .
>   for f in list(os.listdir(), sorted=True): . . .
>
> To my eye, the first form reads much better in every case.
> It still needs a better name though.

You're forgetting the cases in which (e.g.) tasks is not necessarily a list, 
but any finite sequence (iterable or iterator).  Then. e.g. the first job
becomes:

todo = [t for t in list(tasks).copysort() if due_today(t)]
todo = [t for t in list.sorted(tasks) if due_today(t)]
todo = [t for t in list(tasks, sorted=True) if due_today(t)]

and I think you'll agree that the first construct isn't that good then
(quite apart from the probably negligible overhead of an unneeded
copy -- still, we HAVE determined that said small overhead needs
to be paid sometimes, and needing to code list(x).copysort() when
x is not a list or you don't KNOW if x is a list adds one copy then).


> [Phillip J. Eby in a separate note]
>
> > Wouldn't it need to grow key and cmpfunc, too?
>
> Now, that "key" and "reverse" are available,
> there is no need for "cmp" in any new methods.

Sorry, but much as I dislike cmpfunc it's still opportune at times, e.g.
I'd rather code:

def Aup_Bdown(x, y):
    return cmp(x.A, y.A) or cmp(y.B, x.B)

for a in list.sorted(foo, cmp=Aup_Bdown): ...

than 

for a in list.sorted(
    list.sorted(foo, key=lambda x:x.B, reverse=True),
    key=lambda x: x.A): ...

or even

for a in list(foo).copysort(key=lambda x:x.B, reverse=True
    ).copysort(key=lambda x: x.A): ...


Alex




More information about the Python-Dev mailing list