194

我想从一个字符串中读取一些字符s1并将其放入另一个字符串s2中。

但是,分配给s2[j]会出错:

s2[j] = s1[i]

# TypeError: 'str' object does not support item assignment

在 C 中,这有效:

int i = j = 0;
while (s1[i] != '\0')
    s2[j++] = s1[i++];

我在 Python 中的尝试:

s1 = "Hello World"
s2 = ""
j = 0

for i in range(len(s1)):
    s2[j] = s1[i]
    j = j + 1
4

10 回答 10

162

其他答案是正确的,但是您当然可以执行以下操作:

>>> str1 = "mystring"
>>> list1 = list(str1)
>>> list1[5] = 'u'
>>> str1 = ''.join(list1)
>>> print(str1)
mystrung
>>> type(str1)
<type 'str'>

如果你真的想。

于 2013-08-01T23:44:02.923 回答
134

在 Python 中,字符串是不可变的,因此您不能就地更改它们的字符。

但是,您可以执行以下操作:

for c in s1:
    s2 += c

之所以有效,是因为它是以下方面的捷径:

for c in s1:
    s2 = s2 + c

上面每次迭代都会创建一个新字符串,并将对该新字符串的引用存储在s2.

于 2012-05-17T07:19:38.530 回答
23

分配给s2[j]会出错

字符串是不可变的,因此您在 C 中所做的事情在 Python 中是不可能的。相反,您必须创建一个新字符串。

我想从字符串中读取一些字符并将其放入其他字符串中。

使用切片

>>> s1 = 'Hello world!!'
>>> s2 = s1[6:12]
>>> print(s2)
world!
于 2012-05-17T07:23:13.453 回答
6

正如 aix 提到的 - 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[:]
于 2012-05-17T07:24:32.990 回答
1

如果您想将特定字符换成另一个字符,另一种方法是:

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:])
于 2018-08-18T06:24:37.453 回答
0

性能方法

如果您经常执行索引替换,一种性能更高且内存更紧凑的方法是转换为不同的数据结构。然后,完成后转换回字符串。

列表:

最简单最简单的:

s = "TEXT"
s = list(s)
s[1] = "_"
s = "".join(s)

字节数组(ASCII):

此方法使用较少的内存。内存也是连续的,但如果你在做单元素随机访问,这在 Python 中并不重要:

ENC_TYPE = "ascii"
s = "TEXT"
s = bytearray(s, ENC_TYPE)
s[1] = ord("_")
s = s.decode(ENC_TYPE)

字节数组(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)

虽然这种方法可能比 using 更节省内存list,但它确实需要更多的操作。

于 2021-08-18T23:58:18.963 回答
0

其他答案将字符串转换为列表或逐字符构造新字符串。这些方法的成本可能很高,尤其是对于大字符串。相反,我们可以使用切片来获取字符串中更改字符前后的部分,并将它们与新字符组合。

在这里,我修改了Crowman 答案中的示例代码,以使用字符串切片而不是转换为列表来替换字符串中的单个字符。

>>> str1 = "mystring"
>>> pos = 5
>>> new_char = 'u'
>>> str2 = str1[:pos] + new_char + str1[pos+1:]
>>> print(str2)
mystrung
>>> type(str2)
<class 'str'>
于 2021-11-16T22:28:12.827 回答
0

'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
于 2022-01-17T09:21:41.290 回答
-1

这个解决方案怎么样:

str="Hello World" (如问题中所述) srr = str+ ""

于 2013-08-01T22:16:52.310 回答
-1

您好,您应该尝试字符串拆分方法:

i = "Hello world"
output = i.split()

j = 'is not enough'

print 'The', output[1], j
于 2016-01-01T21:52:57.687 回答