[Tutor] "if clause" in list comprehensions.

Alan Gauld alan.gauld at btinternet.com
Mon Oct 19 21:20:17 CEST 2009

"Sander Sweers" <sander.sweers at gmail.com> wrote

>> mylist = ['John', 'Canada', 25, 32, 'right']
>> a = [item.upper() for item in mylist if type(item) == type('good')]
> Usually it is recommended to use hasattr() instead of type()
>    hasattr(s, 'upper')

Nope, they do  completely different things
I think you might be thinking of isinstance() which can be 
used instead of type(). I see you use hasattr as a means of 
testing for a method but that is still different from testing 
type - the method names might be the same but the 
functions be completely different in effect!

>> returned this: ['JOHN', 'CANADA', 'RIGHT']
>> I was expecting this: ['JOHN', 'CANADA', 25, 32, 'RIGHT']
>> So, actually the "if" acted like a filter.

It is intended to be used as a filter.

>> In order to use a list comprehension I created this function instead.
>> def upperfy(item)
>>    try:
>>        item = item.upper()
>>    except AttributeError:
>>        pass
>>    return item

> I would move return item under the except and remove the pass, other
> might disagree on this.

I would :-)
Doing that would result in None being returned for each successful 
conversion. The OPs code is correct (even if unnecessary)

>> a = [upperfy(item) for item in mylist]

a = [item.upper() if type(item) == str else item for item in mylist]

should do it I think.


Alan Gauld
Author of the Learn to Program web site

More information about the Tutor mailing list