我有一个字符串列表需要进行清理。我已经有了一个用于清理的方法,所以我可以这样做:
new_list = map(Sanitize, old_list)
但我不需要保留旧列表。这让我想知道是否有一个类似于map的原地等效函数。编写循环或自定义的原地map方法都很容易,但是否有内置的方法呢?
我有一个字符串列表需要进行清理。我已经有了一个用于清理的方法,所以我可以这样做:
new_list = map(Sanitize, old_list)
但我不需要保留旧列表。这让我想知道是否有一个类似于map的原地等效函数。编写循环或自定义的原地map方法都很容易,但是否有内置的方法呢?
你需要循环:
for i in range(len(old_list)):
old_list[i] = Sanitize(old_list[i])
没有内置的功能。
如评论中建议的:按照OP所需的函数:
def map_in_place(fn, l):
for i in range(len(l)):
l[i] = fn(l[i])
map_in_place(Sanitize, old_list)
def map_in_place(func, a_list):
,我们就有了一个完整的答案。(但是old_list = map(Sanitize, old_list)
虽然不会改变旧列表,但似乎是最好的解决方案。) - Steven Rumbalskithis[0] = something
类似,您也可以指定切片:
>>> x = [1, 2, 3, 4]
>>> x[1:3] = [0, 0]
>>> x
[1, 0, 0, 4]
由于切片可以省略某些部分(起始、终止或步长),您可以通过以下方式更改整个列表:
>>> x = [1, 2, 3, 4]
>>> x[:] = [4, 5, 6]
>>> x
[4, 5, 6]
>>> x = [1, 2, 3, 4]
>>> y = x
>>> x[:] = [3, 4]
>>> y
[3, 4]
在赋值语句的右侧,不一定需要是一个列表。任何可迭代的对象都可以出现在那一侧。事实上,你甚至可以使用一个生成器:
>>> x = ["1", "2", "3", "4"]
>>> x[:] = (int(y) for y in x)
>>> x
[1, 2, 3, 4]
< p > 或者< code >map() 的返回值(在 Python 2 中为列表;在 Python 3 中为< code >map 对象):
>>> x = ["1", "2", "3", "4"]
>>> x[:] = map(int, x)
说到底,
old_list = map(Sanitize, old_list)
将会完全按照您的需求完成。
您可能会认为创建一个新的列表对象并回收旧的对象比使用现有对象要慢。实际上,这几乎永远不会成为问题(分配一块内存作为一次性操作不太可能成为瓶颈;如果您正在循环中执行此操作或者有一个非常长的列表,可以尝试进行基准测试,但我仍然会反对)。请记住,无论哪种方式,您都必须从头开始创建新字符串作为Sanitize
的一部分,这将会更加昂贵。
值得注意的是,正如mluebke
所指出的那样,这些天列表推导式被认为比map
更具有"Python风格"(我相信map
在未来的版本中已被弃用)。
编辑:啊,我看到您正在尝试编辑传递给函数的参数值。我强烈主张这是"不符合Python风格"的,您应该将新列表作为返回值之一返回(请记住,使用元组您可以拥有多个返回值)。
old_list[:] = map(Sanitize, old_list)
。 - John La Rooy