Misuse of list comprehensions?

Paul McGuire ptmcg at austin.rr.com
Tue May 20 11:54:39 EDT 2008


On May 20, 10:17 am, Arnaud Delobelle <arno... at googlemail.com> wrote:
> Paul McGuire <pt... at austin.rr.com> writes:
> > On May 20, 8:13 am, "John Salerno" <johnj... at NOSPAMgmail.com> wrote:
> >> I posted this code last night in response to another thread, and after I
> >> posted it I got to wondering if I had misused the list comprehension. Here's
> >> the two examples:
>
> >> Example 1:
> >> --------------------
> >> def compress(s):
> >>     new = []
>
> >>     for c in s:
> >>         if c not in new:
> >>             new.append(c)
> >>     return ''.join(new)
> >> ----------------------
>
> >> Example 2:
> >> ------------------------
> >> def compress(s):
> >>     new = []
> >>     [new.append(c) for c in s if c not in new]
> >>     return ''.join(new)
> >> --------------------------
>
> >> In example 1, the intention to make an in-place change is explicit, and it's
> >> being used as everyone expects it to be used. In example 2, however, I began
> >> to think this might be an abuse of list comprehensions, because I'm not
> >> assigning the result to anything (nor am I even using the result in any
> >> way).
>
> >> What does everyone think about this? Should list comprehensions be used this
> >> way, or should they only be used to actually create a new list that will
> >> then be assigned to a variable/returned/etc.?
>
> > Why not make the list comp the actual list you are trying to build?
>
> > def compress(s):
> >     seen = set()
> >     new = [c for c in s if c not in seen and (seen.add(c) or True)]
>
> <split hairs>
> Isn't
>
>     c not in seen and (seen.add(c) or True)
>
> the same as
>
>     seen.add(c) or c not in seen
>
> ?
>
> >     return ''.join(new)
>
> (notice I haven't closed the tag!)
>
> --
> Arnaud- Hide quoted text -
>
> - Show quoted text -

Unfortunately, no.  "seen.add(c) or c not in seen" will never return
true, since c gets added to seen before testing if c in seen.

-- Paul



More information about the Python-list mailing list