我想在python 2.7中替换列表中的部分字符串,但这不符合我的预期:
>>> list = ['apples', 'oranges', 'bananas']
>>> for item in list:
... item=item.replace('app', 'spam')
...
>>> list
['apples', 'oranges', 'bananas']
我希望输出为:['spamles', 'oranges', 'bananas']
。
正确的做法是什么?我知道我可以创建一个新列表,并将每个项目单独添加到新列表中,但这听起来像很多工作,可能需要两倍的内存。
答案 0 :(得分:5)
请注意list
不是一个好的本地变量名。
你的代码不工作的原因是,你没有替换循环中的相应元素,你只是将它分配给局部变量。
试试这个:
x = ['apples', 'oranges', 'bananas']
for i, item in enumerate(x):
item=item.replace('app', 'spam')
x[i] = item
#Or just
#x[i] = item.replace('app', 'spam')
演示:
>>> x = ['apples', 'oranges', 'bananas']
>>> for i, item in enumerate(x):
... item=item.replace('app', 'spam')
... x[i] = item
...
>>> x
['spamles', 'oranges', 'bananas']
>>>
或者,您可以使用list comprehensions:
>>> x = ['apples', 'oranges', 'bananas']
>>> x = [a.replace("app", "spam") for a in x ]
>>> x
['spamles', 'oranges', 'bananas']
>>>
答案 1 :(得分:1)
for item in list:
这会为列表中的每个后续元素创建一个新引用(item
)。然后,您将引用item
重新绑定到其他内容,然后抛弃该引用。
我知道我可以创建一个新列表并将每个项目添加到新列表中 单独列出,但这听起来像很多工作和可能 需要两倍的内存。
过早优化是一些邪恶的根源。可能不是所有邪恶,而是它的一些子集。
但严重的是,临时创建3(甚至3千)个字符串列表的内存开销值得考虑。只需创建一个新列表:
li = ['apples', 'oranges', 'bananas']
li = [x.replace('app','spam') for x in li]
#li = ['spamles', 'oranges', 'bananas']
(不要列出您的列表list
,它会遮挡内置的内容)
如果你绝对的话,肯定要在适当的位置改变你的名单:
for i,x in enumerate(li):
li[i] = x.replace('app','spam')
虽然这不会创建一个新列表(暂时保存内存),但它实际上会比列表理解版本慢,所以“优化”实际上并没有让你到处都是。
答案 2 :(得分:1)
当您想要分配给列表项时,您只需重新分配给名为item
的变量:
for i, item in enumerate(list):
list[i] = item.replace('app', 'spam')
此代码仅供演示。真正的解决方案是使用列表理解,就像@karthikr的回答一样。