On Mon, Oct 19, 2009 at 2:14 PM, vince spicer <vinces1...@gmail.com> wrote:

>
>
> On Mon, Oct 19, 2009 at 1:58 PM, Emile van Sebille <em...@fenx.com> wrote:
>
>> On 10/19/2009 12:20 PM Alan Gauld said...
>>
>>
>>> "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.
>>>
>>
>> or even
>>
>>  a = [ str(item).upper() for item in mylist ]
>>
>> Emile
>>
>>
>>
>>> HTH,
>>>
>>>
>>>
>> _______________________________________________
>> Tutor maillist  -  Tutor@python.org
>> To unsubscribe or change subscription options:
>> http://mail.python.org/mailman/listinfo/tutor
>>
>
>
> Lambda can save the day to keep everything on one line, and leave variable
> type the same:
>
> mylist = ['John', 'Canada', 25, 32, 'right']
> new_list = [(lambda y: y.upper() if hasattr(y, 'upper') else y)(a) for a in
> mylist ]
>
> >>  ['JACK', 'CANADA', 25, 32, 'RIGHT']
>
> Vince
>

wrong var name "x", fixed
_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor

Reply via email to