‘str’对象不支持项目分配[重复]
- 2025-02-07 08:44:00
- admin 原创
- 57
问题描述:
我想从一个字符串中读取一些字符s1
并将其放入另一个字符串中s2
。
但是,分配给s2[j]
会出现错误:
s2[j] = s1[i]
# TypeError: 'str' object does not support item assignment
在 C 语言中,这个方法是有效的:
int i = j = 0;
while (s1[i] != ' ')
s2[j++] = s1[i++];
我在 Python 中的尝试:
s1 = "Hello World"
s2 = ""
j = 0
for i in range(len(s1)):
s2[j] = s1[i]
j = j + 1
解决方案 1:
其他答案都是正确的,但是你当然可以做类似的事情:
>>> str1 = "mystring"
>>> list1 = list(str1)
>>> list1[5] = 'u'
>>> str1 = ''.join(list1)
>>> print(str1)
mystrung
>>> type(str1)
<type 'str'>
如果你真的想要的话。
解决方案 2:
在 Python 中,字符串是不可变的,因此您不能就地更改其字符。
但是,您可以执行以下操作:
for c in s1:
s2 += c
这样做的原因是,它是以下操作的快捷方式:
for c in s1:
s2 = s2 + c
上述代码在每次迭代时创建一个新字符串,并将对该新字符串的引用存储在中s2
。
解决方案 3:
分配
s2[j]
给给出错误
字符串是不可变的,所以你在 C 中所做的操作在 Python 中是行不通的。相反,你必须创建一个新的字符串。
我想从一个字符串中读取一些字符并将其放入其他字符串中。
使用切片:
>>> s1 = 'Hello world!!'
>>> s2 = s1[6:12]
>>> print(s2)
world!
解决方案 4:
高效方法
如果您经常执行索引替换,则更高效且内存紧凑的方法是转换为不同的数据结构。然后在完成后再转换回字符串。
列表:
最简单、最容易:
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 + 1 + len(replacement))
s[start:end] = bytearray(replacement, ENC_TYPE)[ENC_WIDTH:]
s = "TEXT HI ひ RA ら GA が NA な DONE"
s = bytearray(s, ENC_TYPE)
replace(s, 1, "_")
s = s.decode(ENC_TYPE)
尽管这种方法可能比使用更节省内存list
,但它确实需要更多的操作。
解决方案 5:
Python 中的字符串是不可变的(您无法就地更改它们)。
您要做的事情可以通过多种方式完成:
复制字符串:
foo = 'Hello'
bar = foo
通过连接旧字符串的所有字符来创建新字符串:
new_string = ''.join(c for c in oldstring)
切片并复制:
new_string = oldstring[:]
解决方案 6:
其他答案将字符串转换为列表或逐个字符构造新字符串。这些方法可能成本高昂,尤其是对于大型字符串。相反,我们可以使用切片来获取更改字符前后的字符串部分,并将它们与新字符组合在一起。
在这里,我修改了Crowman 的答案中的示例代码,使用字符串切片而不是转换为列表来替换字符串中的单个字符。
>>> str1 = "mystring"
>>> pos = 5
>>> new_char = 'u'
>>> str2 = str1[:pos] + new_char + str1[pos+1:]
>>> print(str2)
mystrung
>>> type(str2)
<class 'str'>
解决方案 7:
如果您想将特定字符换成另一个字符,则可以使用另一种方法:
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:])
解决方案 8:
这个解决方案怎么样:
str="Hello World"(如问题所述) srr = str+ ""
解决方案 9:
你好,你应该尝试字符串分割方法:
i = "Hello world"
output = i.split()
j = 'is not enough'
print 'The', output[1], j
解决方案 10:
'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