"Sander Sweers" <sander.swe...@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/

_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor

Reply via email to