[Python-3000] Adding sorting to generator comprehension
Ian Bicking
ianb at colorstudy.com
Wed Apr 26 21:15:19 CEST 2006
Josiah Carlson wrote:
> Talin <talin at acm.org> wrote:
>
>>Ian Bicking <ianb <at> colorstudy.com> writes:
>>
>>>Josiah Carlson wrote:
>>>
>>>>One of the features of generator expressions which makes it desireable
>>>>instead of list comprehensions is that generator expressions may use
>>>>less memory *now*, and may be able to start returning results *now*.
>>>>
>>>>Using (<genexp> orderby ...) as a replacement for sorted((genexp), key=...)
>>>>is a bit misleading because while the original generator expression
>>>>could have been space and time efficient, the orderby version certainly may
>>>>not be.
>>>
>>>Certainly it changes the performance substantially (of course if the
>>>expression is translated and executed elsewhere the performance can
>>>actually be improved, so it can go both ways). Since list
>>>comprehensions are planned to just be syntactic sugar for generator
>>>comprehension, generator comprehensions are now the more fundamental
>>>construct.
>>>
>>>But yeah, it is a little awkward, since something that is sorted can be
>>>returned as a list anyway, except for the fact that the expression
>>>itself could be ported off elsewhere which isn't normal Python. (But
>>>should be normal Python!)
>>>
>>
>>I think that I am (mostly) in agreement with Ian on this one, but perhaps with
>>different reasoning.
>>
>>There seems to be a common feeling on py-dev that "list comprehensions are just
>>a special case of generators expressions, so really, we don't need them".
>>
>>But then we turn around and say "Well, this feature might be handy for list
>>comprehensions, but since list comprehensions are based on generator
>>expressions, and since this feature would make generator expressions
>>inefficient, we won't do it."
>
>
> No. I was only responding to the question of orderby in relation to
> generator expressions. In generator expressions, it is further
> unnecessary because one can always wrap the generator expression up with
> a sorted(genexp, ...) to get your sorted version of the generator (in
> list form).
>
> In the case of list comprehensions, it is doubly unnecessary, because
> you can again use sorted([genexp], ...) or even list.sort(...) .
Using sorted is syntactically different:
[(p.fname, p.lname) for p in person
orderby (p.lname, p.fname)]
vs:
sorted((p.fname, p.lname) for p in person,
key=lambda name: (name[1], name[0]))
It's not a huge difference, but to argue that it's unnecessary because
sorted() exists is the same as arguing that list/generator
comprehensions are unnecessary because of map/imap and filter/ifilter.
>>The fact is that sorting happens a *lot*. Sorting with key= happens a lot. A
>>large proportion of my list comprehensions involve sorting or ordering of one
>>form or another, and the number of ugly sorted + key + lambda expressions is
>>enough to convince me that an "orderby" or "ascending" or whatever clause would
>>be a welcome addition.
>
>
> Sorting may happen "a *lot*" with what you write, but in the software
> that I write, sorting *rarely* happens. If you would like to lessen
> your use of lambda, you should consider discovering the
> operator.attrgetter() and operator.itemgetter() functions to be passed
> to sorted().
Well now you are just being silly...
foo.sort(key=lambda x: x.name)
or
import operator
foo.sort(key=operator.attrgetter('name'))
? That second one is just there for people who are irrationally opposed
to lambda, it's not a serious alternative. If someone asked me how to
sort based on an attribute, I would *never* tell them to use
operator.attrgetter().
--
Ian Bicking / ianb at colorstudy.com / http://blog.ianbicking.org
More information about the Python-3000
mailing list