[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.
HTH,
--
Alan Gauld
Author of the Learn to Program web site
http://www.alan-g.me.uk/
More information about the Tutor
mailing list