2015-03-27 3 views

ответ

8

Вы можете использовать str.translate() method иметь Python заменять символы другими символами в одном шаге.

Используйте string.maketrans() function отобразить символы нижнего регистра в их заглавных целей:

try: 
    # Python 2 
    from string import maketrans 
except ImportError: 
    # Python 3 made maketrans a static method 
    maketrans = str.maketrans 

vowels = 'aeiouy' 
upper_map = maketrans(vowels, vowels.upper()) 
mystring.translate(upper_map) 

Это быстрее и более «правильный» способ заменить некоторые символы в строке; вы всегда можете превратить результат mystring.translate() в список, но я сильно сомневаюсь, что вы хотели в конечном итоге получить строку в первую очередь.

Демо:

>>> try: 
...  # Python 2 
...  from string import maketrans 
... except ImportError: 
...  # Python 3 made maketrans a static method 
...  maketrans = str.maketrans 
... 
>>> vowels = 'aeiouy' 
>>> upper_map = maketrans(vowels, vowels.upper()) 
>>> mystring = "hello world" 
>>> mystring.translate(upper_map) 
'hEllO wOrld' 
+2

hahaha .... вы не поверите, что я открыл в своем редакторе: p –

+1

@JonClements Неудивительно, что ИИ сегодня настолько умны, чтобы соскоблить коды из редактора щенка –

+1

@JonClements: угадайте, что я [все еще был открыт на другой вкладке] (https: // stackoverflow.ком/вопросы/29307814/как заменяемый-символов-в-строке-бай-зе-некст-один/29307923 # 29307923). :-П –

5

Вы не вносите изменений в первоначальный список. Вы вносите изменения только в переменную цикла c. В качестве обходного пути вы можете попробовать использовать enumerate.

mystring = "hello world" 
toUpper = ['a', 'e', 'i', 'o', 'u', 'y'] 
array = list(mystring) 

for i,c in enumerate(array): 
    if c in toUpper: 
     array[i] = c.upper() 

print(array) 

Выход

['h', 'E', 'l', 'l', 'O', ' ', 'w', 'O', 'r', 'l', 'd'] 

Примечание: Если вы хотите hEllO wOrld в качестве ответа, вы можете также использовать join как в ''.join(array) выражении генератора

1

Использовать так:

newstring = ''.join(c.upper() if c in toUpper else c for c in mystring) 
+0

Исправлено это Стивен. –

3

Вы можете сделать:

mystring = "hello world" 
toUpper = ['a', 'e', 'i', 'o', 'u', 'y'] 

>>> ''.join([c.upper() if c in toUpper else c for c in mystring]) 
hEllO wOrld 
+0

Нет причин для создания списка. Опустите скобки и перейдите с выражением генератора: '. '.join (c.upper(), если c в toUpper else c для c в mystring)' –

+1

@StevenRumbalski - На самом деле, в случае 'str.join', как правило, более эффективно. См. Http://stackoverflow.com/a/9061024/2555451. Конечно, с небольшими списками разница довольно незначительна. – iCodez

+0

@iCodez: достаточно справедливо. Стилистически, я по-прежнему предпочитаю (почти незаметно) более простой код. Производительность не может быть нашей единственной заботой. В конце концов, мы кодируем Python. (По-моему, кажется, что побеждает метод 'maketrans'.) –

1

Проблема в том, что al c не используется ни для чего, это не проходит по ссылке.

Я хотел бы сделать это так, для начинающих:

mystring = "hello world" 
toUpper = ['a', 'e', 'i', 'o', 'u', 'y'] 
array = [] 
for c in mystring: 
    if c in toUpper: 
     c = c.upper() 
    array.append(c) 
print(''.join(array)) 
0

Это сделает работу. Имейте в виду, что строки неизменяемы, поэтому вам нужно будет внести некоторые изменения в создание новых строк, чтобы заставить это работать.

myString = "hello world" 
toUpper = ['a', 'e', 'i', 'o', 'u', 'y'] 
newString = reduce(lambda s, l: s.replace(l, l.upper()), toUpper, myString) 
Смежные вопросы