2014-10-26 57 views
-2

为大写我有一个列表:分割和改变一个词的第一个字符在Python

s = ['SMITH', 'JONES', 'Paul'] 

我只需要每个元素的拳头字母是大写字母,所有元素都用下划线进行连接:

s = ['Smith_Jones_Paul'] 

我有一些这些,并希望做一个循环来改变他们所有人。你可以帮我吗?

回答

3

使用capitalize字符串的方法对每个单词的列表,然后join用下划线在一起字符串:

>>> '_'.join(x.capitalize() for x in s) 
'Smith_Jones_Paul' 

总之...

  • capitalize把一个字符串的第一个字符大写字母和随后的字符变为小写字母。
  • (x.capitalize() for x in s)capitalize应用于列表s中的每个字符串。
  • join获取字符串的列表(或其他可迭代的)并将字符串与分隔符(在本例中为下划线)连接在一起。

N.B.值得一提的是,通过列表来join是不是给它更有效率上面显示的生成器表达式:

>>> %timeit '_'.join([x.capitalize() for x in s]) # list 
1000000 loops, best of 3: 866 ns per loop 

>>> %timeit '_'.join(x.capitalize() for x in s) # generator 
100000 loops, best of 3: 2.05 us per loop 
+0

+1,但使用列表更有效率加入 – 2014-10-26 20:20:32

+0

@PadraicCunningham谢谢你,我会将这一点加入到答案中。 – 2014-10-26 20:22:03

+0

不幸的是,如果我打印我得到'史密斯琼斯保罗' – blackforest 2014-10-26 20:38:54

0

其实,做“手册”的工作是(一点点)快:

>>> "_".join([x[0].upper() + x[1:] for x in s]) 
'Smith_Jones_Paul' 

其实有点迷茫与基准:

>>> %timeit '_'.join([x.capitalize() for x in s]) 
1000000 loops, best of 3: 817 ns per loop 

>>> %timeit '_'.join([x[0].upper() + x[1:] for x in s]) 
1000000 loops, best of 3: 796 ns per loop 

的变化是在这种情况下,真正的高。但是当我为这种情况做一个简单的循环:

z = ["aasdfasdfasdfsadfa", "aasdfasdfasdfsadfa", "aasdfasdfasdfsadfa", 
    "aasdfasdfasdfsadfa", "aasdfasdfasdfsadfb"] * 10 

for i in range(1000000): 
    a = [x[0] + x[1:] for x in z] 

for i in range(1000000): 
    b = [x.capitalize() for x in z] 

有9和16秒的差异!

相关问题