更改字符串列表中的元素

时间:2017-01-19 08:32:27

标签: python

我想创建一个字符串列表。字符串应该都是相同的,除了一些元素,它们应该是不同的。这样做我发现了一个奇怪的行为:

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']

有人请求告诉我我做错了什么吗?非常感谢你的帮助!

3 个答案:

答案 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'