Misuse of list comprehensions?

Arnaud Delobelle arnodel at googlemail.com
Tue May 20 11:17:12 EDT 2008


Paul McGuire <ptmcg 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



More information about the Python-list mailing list