Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中替换列表中所有出现的元素_Python_List_Replace_In Place - Fatal编程技术网

在python中替换列表中所有出现的元素

在python中替换列表中所有出现的元素,python,list,replace,in-place,Python,List,Replace,In Place,假设我有一个列表: myl = [1, 2, 3, 4, 5, 4, 4, 4, 6] 用44替换所有出现的4的就地(双重强调)最有效和最简单的pythonic方法是什么 我也很好奇为什么没有一个标准的方法来做这件事(特别是当字符串有一个不到位的方法时)?我们可以用枚举迭代列表,用新值替换旧值,就像这样 myl = [1, 2, 3, 4, 5, 4, 4, 4, 6] for idx, item in enumerate(myl): if item == 4: myl

假设我有一个列表:

myl = [1, 2, 3, 4, 5, 4, 4, 4, 6]
44
替换所有出现的
4
就地(双重强调)最有效和最简单的pythonic方法是什么


我也很好奇为什么没有一个标准的方法来做这件事(特别是当
字符串
有一个不到位的方法时)?

我们可以用
枚举
迭代列表,用新值替换旧值,就像这样

myl = [1, 2, 3, 4, 5, 4, 4, 4, 6]
for idx, item in enumerate(myl):
    if item == 4:
        myl[idx] = 44
print myl
# [1, 2, 3, 44, 5, 44, 44, 44, 6]
使用列表理解执行替换不到位,如果确实要更改原始列表,则将新值分配到原始列表中

while True:
    try:
        myl[myl.index(4)] = 44
    except:
        break

try-except
方法虽然更像是pythonic
,但效率较低。这将比较本文提供的至少两个答案

这实际上对myl没有任何影响。哈哈,我只是在尝试…对Pythonth来说非常新这很公平:)每个人在某个时候都是新的,但这并不是写错误答案的借口,可能会误导未来的人。此外,即使你设法这样分配,对于找到的每个
4
,它将遍历整个列表前缀。用
O(n^2)
代替
O(n)
@apomene——我这一天写了很多糟糕的答案。幸运的是,有一个小小的“删除”按钮/链接,这样我就可以删除它:-)唯一的问题是我们必须构建一个新列表,并用新列表替换旧列表。我的版本在这里可能是有效的。必须
timeit
并确认。@用生成器表达式替换列表理解可能会有帮助。@bereal请告诉我如何操作@bereal:对分配给切片的对象调用
PySequence\u Fast
,这会扼杀使用生成器的任何好处。@如果旧列表未替换为新列表,则旧列表将通过切片分配进行修改。您可以在片分配之前和之后使用
id(myl)
进行检查,之后仍然相同。@FrerichRaabe不是重复的。通常情况下,类似问题的答案并不关注就地要求。@FrerichRaabe——不完全如此。不指定在位约束的。如果这附近没有其他傻瓜,我会感到惊讶,但事实并非如此;-)@mgilson:我提到的另一个问题也没有指定“不合适”的约束。从这个意义上说,这是一个超集。因此,这些问题的答案既有适当的,也有不适当的(嗯,不确定这是否是适当的答案的倒数)。所以我想你是对的,它不是复制品,而是“相关的”。我收回了我的投票。@FrerichRaabe——肯定是相关的。没有争论:——)@FrerichRaabe实际上我认为他可能是复制品的好候选人;事实上,我想把我的问题贴在那里,但由于种种原因,这个问题已经解决了。这样做效率不高。它之所以看起来这么好,是因为您不小心将括号用于
myl.index[4]
而不是括号。它会立即键入错误,但
除外
会隐藏错误,因此看起来它会立即完成。纠正这个,它看起来不太好。如果您将
4
s移动到列表中后面的100
100
s大块之后,或者如果您添加更多
4
s,则此操作的性能缺点会变得更加明显。创建一个包含高百分比
4
s的列表,性能会急剧下降。@user2357112感谢您指出我们的编码错误。
myl[:] = [x if x != 4 else 44 for x in myl]
while True:
    try:
        myl[myl.index(4)] = 44
    except:
        break