Puzzled

Bengt Richter bokr at oz.net
Tue Jul 12 00:49:37 EDT 2005


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



More information about the Python-list mailing list