我想创建一个字符串列表。字符串应该都是相同的,除了一些元素,它们应该是不同的。这样做我发现了一个奇怪的行为:
x = ['spam', 'spam', 'spam', 'spam', 'spam']
x[1] = 'buzz'
x[2] = 'buzz'
x
Out[35]: ['spam', 'buzz', 'buzz', 'spam', 'spam']
但另一方面:
y = ['spam'] * 5
y[1:3] = ['buzz']
y
Out[36]: ['spam', 'buzz', 'spam', 'spam']
有人请求告诉我我做错了什么吗?非常感谢你的帮助!
答案 0 :(得分:3)
作业:
y = ['spam'] * 5
会导致y
成为这样的列表:
['spam', 'spam', 'spam', 'spam', 'spam']
数组切片 y[1:3]
捕获索引1和2处的元素,如下所示:
['spam', 'spam']
将切片与索引1(切片开始处)的数组对齐:
['spam', 'spam', 'spam', 'spam', 'spam'] # y ['spam', 'spam'] # y[1:3]
现在,当您完成作业y[1:3] = ['buzz']
时,它实际上将其转换为以下内容:
['spam', 'buzz', 'spam', 'spam'] ['buzz']
答案 1 :(得分:1)
y[1:3]
是列表的一部分,您可以将此切片替换为由单个元素组成的列表。
spam spam spam spam spam
\ /
\ /
\ /
spam buzz spam spam
IIUC,您要做的是将其替换为由新元素N次组成的相同大小的列表(buzz)。
你可以写
y[1:3] = ['buzz', 'buzz']
# or equivalently
y[1:3] = ['buzz'] * 2
与使用这样的循环相同且更有效:
for i in [1, 2]:
y[i] = 'buzz'
# or equivalently
for i in range(1, 3):
y[i] = 'buzz'
作为旁注,这是另一个陷阱。字符串是一个迭代器,所以每当需要迭代器并传递一个字符串时,字符串就会逐个字符迭代,作为一个字符的字符串列表:
y[1:3] = 'buzz'
print(y)
# ['spam', 'b', 'u', 'z', 'z', 'spam', 'spam', 'spam']
在这种情况下,切片[1:3]
将替换为您提供的迭代器,即'buzz',视为['b', 'u', 'z', 'z']
。
答案 2 :(得分:0)
y[1:3] = ['buzz']
这与y[1] = 'buzz'
加y[2] = 'buzz'
只需做一个for循环
for i in [1,2..whatever you need to change]:
y[i] = 'buzz'