Объект 'str' не поддерживает назначение элементов в Python
Я хотел бы прочитать некоторые символы из строки и поместить ее в другую строку (как мы делаем в C).
Так что мой код, как показано ниже
import string
import re
str = "Hello World"
j = 0
srr = ""
for i in str:
srr[j] = i #'str' object does not support item assignment
j = j + 1
print (srr)
В C код может быть
i = j = 0;
while(str[i] != '\0')
{
srr[j++] = str [i++];
}
Как я могу реализовать то же самое в Python?
11 ответов
В Python строки являются неизменяемыми, поэтому вы не можете менять их символы на месте.
Вы можете, однако, сделать следующее:
for i in str:
srr += i
Это работает потому, что это ярлык для:
for i in str:
srr = srr + i
Приведенное выше создает новую строку с каждой итерацией и сохраняет ссылку на эту новую строку в srr
,
Другие ответы верны, но вы, конечно, можете сделать что-то вроде:
>>> str1 = "mystring"
>>> list1 = list(str1)
>>> list1[5] = 'u'
>>> str1 = ''.join(list1)
>>> print(str1)
mystrung
>>> type(str1)
<type 'str'>
если ты действительно хочешь.
Строки Python являются неизменяемыми, поэтому то, что вы пытаетесь сделать в C, будет просто невозможно в Python. Вам нужно будет создать новую строку.
Я хотел бы прочитать некоторые символы из строки и поместить ее в другую строку.
Затем используйте фрагмент строки:
>>> s1 = 'Hello world!!'
>>> s2 = s1[6:12]
>>> print s2
world!
Как уже упоминалось, строки в Python являются неизменяемыми (вы не можете изменить их на месте).
То, что вы пытаетесь сделать, может быть сделано разными способами:
# Copy the string
foo = 'Hello'
bar = foo
# Create a new string by joining all characters of the old string
new_string = ''.join(c for c in oldstring)
# Slice and copy
new_string = oldstring[:]
Исполнительские методы
Если вы часто выполняете замену индекса, более производительным и компактным для памяти методом является преобразование в другую структуру данных. Затем преобразуйте обратно в строку, когда закончите.
список:
Самый простой и простой:
s = "TEXT"
s = list(s)
s[1] = "_"
s = "".join(s)
bytearray (ASCII):
Этот метод использует меньше памяти. Память также является непрерывной, хотя в Python это не имеет большого значения, если вы все равно выполняете одноэлементный произвольный доступ:
ENC_TYPE = "ascii"
s = "TEXT"
s = bytearray(s, ENC_TYPE)
s[1] = ord("_")
s = s.decode(ENC_TYPE)
bytearray (UTF-32):
В более общем плане для символов вне базового набора ASCII я рекомендую использовать UTF-32 (или иногда UTF-16), что обеспечит выравнивание для произвольного доступа:
ENC_TYPE = "utf32"
ENC_WIDTH = 4
def replace(s, i, replacement):
start = ENC_WIDTH * (i + 1)
end = ENC_WIDTH * (i + 2)
s[start:end] = bytearray(replacement, ENC_TYPE)[ENC_WIDTH:]
s = "TEXT HI ひ RA ら GA が NA な DONE"
s = bytearray(s, ENC_TYPE)
# Performs s[1] = "_"
replace(s, 1, "_")
s = s.decode(ENC_TYPE)
Хотя этот метод может быть более компактным, чем использование
Другие ответы преобразуют строку в список или создают новую строку символ за символом. Эти методы могут быть дорогостоящими, особенно для больших строк. Вместо этого мы можем использовать нарезку, чтобы получить части строки до и после измененного символа и объединить их с новым символом.
Здесь я изменяю пример кода из ответа Кроумана, чтобы заменить один символ в строке, используя нарезку строки вместо преобразования в список.
>>> str1 = "mystring"
>>> pos = 5
>>> new_char = 'u'
>>> str2 = str1[:pos] + new_char + str1[pos+1:]
>>> print(str2)
mystrung
>>> type(str2)
<class 'str'>
Другой подход, если вы хотите поменять определенный символ на другого:
def swap(input_string):
if len(input_string) == 0:
return input_string
if input_string[0] == "x":
return "y" + swap(input_string[1:])
else:
return input_string[0] + swap(input_string[1:])
В ситуации моего гениального новичка я пытался неправильно добавить ключи/значения в словарь. вот так.
mydict = {}
mydict = mydict['my_key'] = 'my_value'
Где это должно быть.
mydict['my_key'] = 'my_value'
Привет, вы должны попробовать метод разделения строк:
i = "Hello world"
output = i.split()
j = 'is not enough'
print 'The', output[1], j
Как насчет этого решения:
str = "Hello World" (как указано в проблеме) srr = str+ ""
«str» — это неизменяемый тип данных. Поэтому объект типа str не поддерживает назначение элементов.
s1 = "Hello World"
s2 = ['']*len(s1)
j = 0
for i in range(len(s1)):
s2[j]=s1[i]
j = j + 1
print(''.join(s2)) # Hello World