2014-10-26 63 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秒的差異!

相關問題