[Tutor] "if clause" in list comprehensions.
Emile van Sebille
emile at fenx.com
Mon Oct 19 21:58:47 CEST 2009
On 10/19/2009 12:20 PM Alan Gauld said...
> "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)
>>> item = item.upper()
>>> except AttributeError:
>>> 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.
a = [ str(item).upper() for item in mylist ]
More information about the Tutor