Puzzled

Colin J. Williams cjw at sympatico.ca
Tue Jul 12 09:20:17 EDT 2005


Bengt Richter wrote:
> On Mon, 11 Jul 2005 22:10:33 -0400, "Colin J. Williams" <cjw at sympatico.ca> wrote:
> 
> 
>>The snippet of code below gives the result which follows
>>
>>for k in ut.keys():
>>  name= k.split('_')
>>  print '\n1', name
>>  if len(name) > 1:
>>    name[0]= name[0] + name[1].capitalize()
>>    print '2', name
>>  name[0]= name[0].capitalize()
>>  print '3', name
>>
>>1 ['logical', 'or']
>>2 ['logicalOr', 'or']
>>3 ['Logicalor', 'or']
>>
>>I was expecting that 3 would read ['LogicalOr', 'or']
>>
>>If I replace the above code with:
>>
>>for k in ut.keys():
>>  name= k.split('_')
>>  print '\n1', name
>>  if len(name) > 1:
>>    name[0]= name[0].capitalize() + name[1].capitalize()
>>    print '2', name
>>  else:
>>    name[0]= name[0].capitalize()
>>  print '3', name
>>
>>I get the desired result.
>>
> 
> If you walk through the results, you can see what happens to name[2] on output line 2:
> 
>  >>> 'logicalOr'.capitalize()
>  'Logicalor'
> 
> I.e., 
>  >>> help(str.capitalize)
>  Help on method_descriptor:
> 
>  capitalize(...)
>      S.capitalize() -> string
> 
>      Return a copy of the string S with only its first character
>      capitalized.                       ^^^^-- meaning all the rest lowercased,
>                                                which changed your trailing 'Or'
> 
> So, doing .capitalize on all the pieces from split('_') and then joining them:
> 
>  >>> def doit(w): return ''.join([s.capitalize() for s in w.split('_')])
>  ...
>  >>> doit('logical_or')
>  'LogicalOr'
>  >>> doit('logical')
>  'Logical'
>  >>> doit('logical_or_something')
>  'LogicalOrSomething'
>  >>> doit('UP_aNd_down')
>  'UpAndDown'
> 
> Regards,
> Bengt Richter
Many thanks. I missed the implication that any upper case characters 
after the first are changed to lower case.

Colin W.



More information about the Python-list mailing list