如何替换列表中的部分字符串?

时间:2013-11-16 21:06:34

标签: python

我想在python 2.7中替换列表中的部分字符串,但这不符合我的预期:

>>> list = ['apples', 'oranges', 'bananas']
>>> for item in list: 
...  item=item.replace('app', 'spam') 
... 
>>> list
['apples', 'oranges', 'bananas']

我希望输出为:['spamles', 'oranges', 'bananas']

正确的做法是什么?我知道我可以创建一个新列表,并将每个项目单独添加到新列表中,但这听起来像很多工作,可能需要两倍的内存。

3 个答案:

答案 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的回答一样。