2014-10-26 1 views
-2

У меня есть список:Split и изменить первый символ слова в верхний регистр в 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 но использование списка более эффективно с присоединением –

+0

@PadraicCunningham Спасибо, я добавлю, что точка ответа. –

+0

К сожалению, если я печатаю, я получаю «smith jones paul» – blackforest

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 секунд!

Смежные вопросы