[英]Is there an in-place equivalent to 'map' in python?
我有一个需要消毒的字符串列表。 我有一种消毒方法,所以我可以这样做:
new_list = map(Sanitize, old_list)
但我不需要保留旧列表。 这让我想知道是否有一个相当于地图的就地。 很容易为它编写for循环(或自定义就地映射方法),但是内置了什么?
答案很简单:不。
当答案为否时 ,“XXX存在”形式的问题从未倾向于直接回答,所以我想我会把它放在那里。
大多数itertools助手和内置函数都在泛型迭代器上运行。 map
, filter
,list comprehensions, for
they所有工作在迭代器上,而不是修改原始容器(如果有的话)。
为什么这个类别中没有任何变异功能? 因为没有通用的通用方法来为容器的键和值赋值。 例如,基本的dict迭代器( for x in {}
)迭代键,并且分配给dict使用dict的结果作为[]的参数。 另一方面,列表迭代值 ,赋值使用隐式索引。 底层的一致性不是提供像这样的通用函数,所以在itertools
或内置函数中没有这样的东西。
他们可以提供它作为list
和dict
的方法,但目前他们没有。 你只需要自己动手。
你必须循环:
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)
在一天结束时,
old_list = map(Sanitize, old_list)
将完全满足您的需求。
您可能会反对创建新的列表对象并收集旧的列表对象比使用现有列表对象慢。 在实践中,这几乎不应该是一个问题(分配作为一次性的一块内存不太可能是一个瓶颈;也许如果你在一个循环中做这个或有一个很长的列表,你可以尝试基准测试,但我仍然会打赌你)。 请记住,无论哪种方式,您都必须从头开始创建新的字符串作为Sanitize
一部分,这将会更加昂贵。
值得注意的是,正如mluebke
指出的那样,这些日子列表理解被认为比map
更加“pythonic”(我相信map
在未来版本的语言中被弃用)。
编辑:啊,我看到你正在尝试编辑传递给函数的参数值。 我非常强烈地认为这是“unpythonic”并且您应该将新列表作为返回值之一返回(请记住,使用元组可以有多个返回值)。
与使用this[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]
或map()
的返回map()
Python 2中的列表; Python 3中的map
对象):
>>> x = ["1", "2", "3", "4"]
>>> x[:] = map(int, x)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.