使用列表中的字符串进行切片分配

Posted

技术标签:

【中文标题】使用列表中的字符串进行切片分配【英文标题】:Slice Assignment with a String in a List 【发布时间】:2012-06-09 18:47:53 【问题描述】:

我仔细阅读了很多内容,但对于我试图理解的概念,我没有明确的答案。

在Python中,如果我取一个列表,比如:

L1=['muffins', 'brownies','cookies']

然后尝试使用代码替换指向列表中对象的第一个指针,即“松饼”:

L1[0:1] = 'cake'

我会得到一个列表 L1:

['c', 'a', 'k', 'e', 'brownies', 'cookies']

但是,如果我采用相同的列表并执行操作(现在使用字符串 cake 中的 4 个元素):

L1[0:4] = ['cake'] # presumably, it's now passing the string cake within a list? (it passed into the modified list shown above)

我得到了我最初想要的输出:

['cake', 'brownies', 'cookies']

谁能解释一下为什么会这样? 我假设当我最初拿蛋糕时没有将它放在“列表”中,它会将字符串分解为单独的字符,以存储为对这些字符的引用,而不是对字符串的单个引用......

但我不完全确定。

【问题讨论】:

你的最后一个例子L1[0:4] = ['cake'] 对我来说产生['cake'],而不是python 2.6 上的['cake', 'brownies', 'cookies']。 -- 另请注意,由于您已经有 5 个赞成票,显然您提出了一个很好的问题 :) 啊,最后一个例子是关于已经修改过的代码 - 如,而不是使用:'L1=['muffins', 'brownies','cookies']',我正在使用 'L1 = ['c', 'a', 'k', 'e', 'brownies', 'cookies']' 执行最后一个示例。 【参考方案1】:

两个重点:

    切片分配在右侧采用一个可迭代对象,并将切片的元素替换为可迭代对象生成的对象。 在 Python 中,字符串是可迭代的:迭代字符串会产生其字符。

这样

L1[0:1] = 'cake'

L1 的第一个元素替换为'cake'单个字符

要将第一个元素替换为字符串'cake',只需编写:

L1[0] = 'cake'

或者,使用切片赋值语法:

L1[0:1] = ['cake']

【讨论】:

非常感谢,感谢您的回复;这消除了很多困惑。【参考方案2】:

如果您指定一个切片,则假定右侧是一个列表/元组(实际上,任何可迭代的 - 但要注意产生无限数量值的生成器)。

要替换列表中的项目,请使用:

my_list[0] = "cake"

(你也可以这样做

my_list[0:1] = ["cake"]

如果你真的想使用列表切片。

这里有几个其他相关的参考: slice assignment more slice assignment

【讨论】:

@Levon - 谢谢你说的好话!顺便说一句,我真的很喜欢您的个人资料 - 我可以为我复制/重述它吗?我很讨厌我在答案中看到的耶耶态度。我尝试用足够的信息来回答这个人,针对我认为是他们的水平(和兴趣)。 当然,继续,很高兴我不是唯一注意到某些成员态度的人。而且我完全同意,我也尝试根据 OP 的水平来调整响应。如果问题非常基本,那么炫耀 Python 的能力是没有意义的。更好地帮助提供一个可靠的基本答案,并将花哨的东西留给更高级的问题:) .. 话虽如此,这是一个很好的问题,也得到了我的支持。【参考方案3】:

将字符串视为存储字符的序列容器。当您尝试以这种方式进行分配时,它会将字符序列中的每个项目添加到列表中。通过首先将“cake”包装在它自己的 1 元素列表中(我们称之为 L2),您将 L2 的每个元素添加到 L1 中——它不会递归地拆分最外层序列之外的序列容器。

L1 = ['muffins', 'brownies','cookies']
L2 = ['cake']
L1[0:1] = L2
print L1
['cake', 'brownies', 'cookies']

对于其他嵌套序列对象也是如此。尝试使用更多的嵌套序列对象,如下所示:

L3 = [['pie', 'eclairs'], ['bacon', 'chocolate']]
L1[0:1] = L3
print L1
[['pie', 'eclairs'], ['bacon', 'chocolate'], 'brownies', 'cookies']

另外值得注意的是,如果您不关心列表中的顺序/位置,您可以使用append(),而不必担心您的字符串会被拆分:

L1 = ['muffins', 'brownies','cookies']
L1.append('cake')
print L1
['muffins', 'brownies', 'cookies', 'cake']

【讨论】:

以上是关于使用列表中的字符串进行切片分配的主要内容,如果未能解决你的问题,请参考以下文章

Python 切片分配内存使用情况

分配如何与列表切片一起使用?

Python中的切片列表或字符串对象[重复]

Python 列表切片操作

python列表(list)+索引切片+修改+插入+删除+range函数生成整数列表对象

Python中的列表和元组