代码之家  ›  专栏  ›  技术社区  ›  Herms

在python中是否有一个与“map”等价的地方?

  •  11
  • Herms  · 技术社区  · 15 年前

    我有一个需要清理的字符串列表。我有消毒方法,所以我可以做:

    new_list = map(Sanitize, old_list)
    

    4 回复  |  直到 8 年前
        1
  •  12
  •   Glenn Maynard    15 年前

    答案很简单:不。

    当“答案是”时,“XXX存在”的问题永远不会直接得到回答。

    大多数itertools帮助程序和内置程序都在通用迭代器上操作。 map , filter ,列出理解, for

    为什么这一类中没有任何变异函数?因为没有通用的、通用的方法根据容器的键和值为容器赋值。例如,基本dict迭代器( for x in {} 价值观 itertools 或者在室内。

    他们可以把它作为 list dict ,但现在没有了。你只需要自己滚。

        2
  •  6
  •   Tom Gruff    14 年前

    你必须循环:

    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)
    
        3
  •  2
  •   YGA    15 年前

    一天结束的时候,

    old_list = map(Sanitize, old_list)
    

    您可能会反对创建新的列表对象,而垃圾回收旧对象则比使用现有的列表对象慢。实际上,这几乎不应该是一个问题(一次性分配一大块内存不太可能成为一个瓶颈;也许如果您在循环中这样做,或者有一个非常长的列表,您可以尝试基准测试,但我仍然会对您下注)。记住,无论哪种方式,都必须从头开始创建新字符串作为 Sanitize

    值得注意的是 mluebke 注意,这些天列表理解被认为比 map 地图 在该语言的未来版本中已弃用)。

    编辑:啊,我看到你在试图编辑传递给函数的参数值。我强烈认为这是“不符合语法的”,应该将新列表作为返回值之一返回(记住,使用元组可以有多个返回值)。

        4
  •  1
  •   zondo L. Scott Johnson    10 年前

    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

    >>> x = ["1", "2", "3", "4"]
    >>> x[:] = map(int, x)