Альтернатива назначению элемента строки Python - PullRequest
23 голосов
/ 26 февраля 2012

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

Т.е. s = "ABCDEFGH" s[1] = 'a' s[-1]='b'?

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

Ответы [ 4 ]

29 голосов
/ 26 февраля 2012

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

>>> s = 'abc{0}efg'.format('d')
>>> s
'abcdefg'

Или объединение:

>>> s = 'abc' + 'd' + 'efg'
>>> s
'abcdefg'

Или замену (спасибо Odomontois за напоминание):

>>> s = 'abc0efg'
>>> s.replace('0', 'd')
'abcdefg'

Но имейте в виду, чтовсе эти методы создают копий строки, а не изменяют ее на месте.Если вы хотите модифицировать на месте, вы можете использовать bytearray - хотя это будет работать только для простых строк ascii, как указывает alexis.

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

6 голосов
/ 26 февраля 2012

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

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)
0 голосов
/ 07 февраля 2018
s = "ABCDEFGH" s[1] = 'a' s[-1]='b'

вы можете использовать как это

s=s[0:1]+'a'+s[2:]

это очень просто, чем другие сложные способы

0 голосов
/ 06 марта 2017

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

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']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...