[Tutor] Yet another list comprehension question
Kent Johnson
kent37 at tds.net
Sat Mar 3 14:47:55 CET 2007
Alan Gauld wrote:
> "Smith, Jeff" <jsmith at medplus.com> wrote
>
>> In other words, applying somefun to the results of the iterator
>> return
>> duplicates but I want the constructed list to contain none.
>
>> l = [somefun(i) for i some-iterator if somefun(i) not in l]
>>
>> doesn't work (not that I expected it to).
>
> Why not use a Set?
>
> s = Set([somefun(i) for i in some-iterator])
>
> Might be slow for big lists though...
This is a popular question. It comes up frequently on comp.lang.python
and there are many recipes in the online cookbook. Here is a FAQ:
http://www.effbot.org/pyfaq/how-do-you-remove-duplicates-from-a-list.htm
I think using a set is the fastest solution if the list items are
hashable and you don't care about order.
If the list items are hashable and you do care about order then there is
this mild hack:
s = set()
[ i for i in lst if i not in s and not s.add(i) ]
but with the requirement of calling somefunc(i) my guess is that an
explicit loop will be faster.
The cookbook is down right now but there is a link in the above FAQ.
Kent
More information about the Tutor
mailing list