изменение одного символа в строке в Python - PullRequest
319 голосов
/ 04 августа 2009

Какой самый простой способ в Python заменить символ в строке?

Например:

text = "abcdefg";
text[1] = "Z";
           ^

Ответы [ 9 ]

447 голосов
/ 04 августа 2009

Не изменять строки.

Работа с ними в виде списков; превращайте их в строки только при необходимости.

>>> s = list("Hello zorld")
>>> s
['H', 'e', 'l', 'l', 'o', ' ', 'z', 'o', 'r', 'l', 'd']
>>> s[6] = 'W'
>>> s
['H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd']
>>> "".join(s)
'Hello World'

Строки Python являются неизменными (то есть они не могут быть изменены). Есть много причин для этого. Используйте списки, пока у вас нет выбора, только затем превращайте их в строки.

157 голосов
/ 03 марта 2014

Самый быстрый метод?

Есть три способа. Для тех, кто ищет скорость, я рекомендую «Метод 2»

Метод 1

Дано этим ответом

text = 'abcdefg'
new = list(text)
new[6] = 'W'
''.join(new)

Что довольно медленно по сравнению с «Методом 2»

timeit.timeit("text = 'abcdefg'; s = list(text); s[6] = 'W'; ''.join(s)", number=1000000)
1.0411581993103027

Метод 2 (БЫСТРЫЙ МЕТОД)

данный этим ответом

text = 'abcdefg'
text = text[:1] + 'Z' + text[2:]

Что намного быстрее:

timeit.timeit("text = 'abcdefg'; text = text[:1] + 'Z' + text[2:]", number=1000000)
0.34651994705200195

Метод 3:

Массив байтов:

timeit.timeit("text = 'abcdefg'; s = bytearray(text); s[1] = 'Z'; str(s)", number=1000000)
1.0387420654296875
122 голосов
/ 04 августа 2009
new = text[:1] + 'Z' + text[2:]
30 голосов
/ 04 августа 2009

Строки Python неизменны, вы изменяете их, делая копию.
Вероятно, самый простой способ сделать то, что вы хотите -

text = "Z" + text[1:]

Текст [1:] возвращает строку в тексте от позиции 1 до конца, позиции считаются от 0, поэтому «1» - второй символ.

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

text = text[:1] + "Z" + text[2:]

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

12 голосов
/ 30 января 2014

Начиная с python 2.6 и python 3 вы можете использовать байт-массивы, которые являются изменяемыми (могут изменяться поэлементно в отличие от строк):

s = "abcdefg"
b_s = bytearray(s)
b_s[1] = "Z"
s = str(b_s)
print s
aZcdefg

edit: изменен str на s

edit2: Как отметил в комментариях двухразрядный алхимик, этот код не работает с юникодом.

4 голосов
/ 04 августа 2009

Как говорили другие люди, обычно строки Python должны быть неизменяемыми.

Однако, если вы используете CPython, реализацию на python.org, можно использовать ctypes для изменения строковой структуры в памяти.

Вот пример, где я использую технику для очистки строки.

Пометить данные как важные в python

Я упоминаю это для полноты картины, и это должно быть вашим последним средством, поскольку оно является хакерским.

1 голос
/ 21 ноября 2015

На самом деле, со строками вы можете сделать что-то вроде этого:

oldStr = 'Hello World!'    
newStr = ''

for i in oldStr:  
    if 'a' < i < 'z':    
        newStr += chr(ord(i)-32)     
    else:      
        newStr += i
print(newStr)

'HELLO WORLD!'

По сути, я "добавляю" + "строки" вместе в новую строку:).

0 голосов
/ 19 апреля 2017

Очень простой способ сделать это:

word = "Heloo World!"
word = word.replace(word[3], "l", 1)
print word

Выход:

 Hello World!
0 голосов
/ 16 декабря 2011

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

Функция изменения текста.

mytext = 'Hello Zorld'
mytext = mytext.replace('Z', 'W')
print mytext,
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...