Каков наилучший/правильный способ использования назначения элемента для строки python?
i.e s = "ABCDEFGH"
s[1] = 'a'
s[-1]='b'
?
Обычный способ бросит: 'str' object does not support item assignment
Каков наилучший/правильный способ использования назначения элемента для строки python?
i.e s = "ABCDEFGH"
s[1] = 'a'
s[-1]='b'
?
Обычный способ бросит: 'str' object does not support item assignment
Строки неизменяемы. Это означает, что вы не можете назначать им вообще. Вы можете использовать форматирование:
>>> s = 'abc{0}efg'.format('d')
>>> s
'abcdefg'
Или конкатенация:
>>> s = 'abc' + 'd' + 'efg'
>>> s
'abcdefg'
Или замена (спасибо Odomontois для напоминания мне):
>>> s = 'abc0efg'
>>> s.replace('0', 'd')
'abcdefg'
Но имейте в виду, что все эти методы создают копии строки, а не изменяют ее на месте. Если вы хотите модификации на месте, вы можете использовать bytearray
- хотя это будет работать только для простых строк ascii, как указывает алексис.
>>> b = bytearray('abc0efg')
>>> b[3] = 'd'
>>> b
bytearray(b'abcdefg')
Или вы можете создать список символов и манипулировать ими. Это, вероятно, самый эффективный и правильный способ делать частые крупномасштабные манипуляции с строками:
>>> l = list('abc0efg')
>>> l[3] = 'd'
>>> l
['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> ''.join(l)
'abcdefg'
И рассмотрим модуль re
для более сложных операций.
Форматирование строк и манипулирование списками - это два метода, которые, скорее всего, будут правильными и эффективными форматированием IMO-string, когда требуется только несколько вставок, и манипулировать списками, когда вам нужно часто обновлять строку.
Так как строки "неизменяемы", вы получаете эффект редактирования, создавая модифицированную версию строки и присваивая ее по старому значению. Если вы хотите заменить или вставить в определенную позицию в строке, наиболее синтаксисом, подобным массиву, является использование срезов:
s = "ABCDEFGH"
s = s[:3] + 'd' + s[4:] # Change D to d at position 3
Скорее всего, вы хотите заменить конкретный символ или строку на другой. Сделайте это с помощью re
, снова собирая результат, а не изменяя его на месте:
import re
s = "ABCDEFGH"
s = re.sub("DE", "--", s)
Я думаю, этот объект мог бы помочь:
class Charray(list):
def __init__(self, mapping=[]):
"A character array."
if type(mapping) in [int, float, long]:
mapping = str(mapping)
list.__init__(self, mapping)
def __getslice__(self,i,j):
return Charray(list.__getslice__(self,i,j))
def __setitem__(self,i,x):
if type(x) <> str or len(x) > 1:
raise TypeError
else:
list.__setitem__(self,i,x)
def __repr__(self):
return "charray['%s']" % self
def __str__(self):
return "".join(self)
Например:
>>> carray = Charray("Stack Overflow")
>>> carray
charray['Stack Overflow']
>>> carray[:5]
charray['Stack']
>>> carray[-8:]
charray['Overflow']
>>> str(carray)
'Stack Overflow'
>>> carray[6] = 'z'
>>> carray
charray['Stack zverflow']