Подтвердить что ты не робот

Альтернатива назначению строки строки python

Каков наилучший/правильный способ использования назначения элемента для строки python?

i.e s = "ABCDEFGH" s[1] = 'a' s[-1]='b'?

Обычный способ бросит: 'str' object does not support item assignment

4b9b3361

Ответ 1

Строки неизменяемы. Это означает, что вы не можете назначать им вообще. Вы можете использовать форматирование:

>>> 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, когда требуется только несколько вставок, и манипулировать списками, когда вам нужно часто обновлять строку.

Ответ 2

Так как строки "неизменяемы", вы получаете эффект редактирования, создавая модифицированную версию строки и присваивая ее по старому значению. Если вы хотите заменить или вставить в определенную позицию в строке, наиболее синтаксисом, подобным массиву, является использование срезов:

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)

Ответ 3

Я думаю, этот объект мог бы помочь:

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']