【问题标题】:Can I use index information inside the map function?我可以在 map 函数中使用索引信息吗?
【发布时间】:2019-04-28 16:21:47
【问题描述】:

假设有一个列表a = [1, 3, 5, 6, 8]

我想对该列表应用一些转换并且我想避免按顺序进行,所以像map(someTransformationFunction, a) 这样的东西通常可以解决问题,但是如果转换需要知道每个对象的索引怎么办?

例如,假设每个元素都必须乘以它的位置。所以列表应该转换为a = [0, 3, 10, 18, 32]

有没有办法做到这一点?

【问题讨论】:

    标签: python python-2.7 map-function


    【解决方案1】:

    使用enumerate()函数添加索引:

    map(function, enumerate(a))
    

    您的函数将被传递一个元组,带有(index, value)。在 Python 2 中,您可以在函数签名中指定 Python 为您解包元组:

    map(lambda (i, el): i * el, enumerate(a))
    

    注意 lambda 参数规范中的 (i, el) 元组。您可以在def 语句中执行相同操作:

    def mapfunction((i, el)):
        return i * el
    
    map(mapfunction, enumerate(a))
    

    为了让位给其他函数签名特性(例如注解),函数参数中的元组解包已从 Python 3 中移除。

    演示:

    >>> a = [1, 3, 5, 6, 8]
    >>> def mapfunction((i, el)):
    ...     return i * el
    ...
    >>> map(lambda (i, el): i * el, enumerate(a))
    [0, 3, 10, 18, 32]
    >>> map(mapfunction, enumerate(a))
    [0, 3, 10, 18, 32]
    

    【讨论】:

    • +1 用于在函数定义中突出显示元组赋值的技巧。我以前从未见过。
    • 所以这个例子只适用于python2?
    • @LetsPlayYahtzee:是的,在 Python 3 中,使用一个参数(这将是一个元组); lambda i_el: i_el[0] * i_el[1];在def 语句中,您可以将其解压缩到单独的行中; def mapfunction(i_el):, newline-and-indent-more, i, el = i_el, newline, match indent, return i * el.
    【解决方案2】:

    你可以使用enumerate():

    a = [1, 3, 5, 6, 8]
    
    answer = map(lambda (idx, value): idx*value, enumerate(a))
    print(answer)
    

    输出

    [0, 3, 10, 18, 32]
    

    【讨论】:

      【解决方案3】:

      为了扩展 Martijn Pieters 的出色回答,您还可以将 list comprehensionsenumerate 结合使用:

      >>> a = [1, 3, 5, 6, 8]
      >>> [i * v for i, v in enumerate(a)]
      [0, 3, 10, 18, 32]
      

      [mapfunction(i, v) for i, v in enumerate(a)]
      

      我觉得列表推导通常比 map/lambda 结构更具可读性。当使用直接接受 (i, v) 元组的命名映射函数时,map 可能会获胜。

      【讨论】:

      • 你是对的,在后一种情况下,map 表示法更有意义。在我的例子中,使用带有 map 的命名函数是正确的选择,因为实际上该函数必须做的不仅仅是乘以索引。
      【解决方案4】:

      为了兼容 Python3

      def map_fn(data):
          idx, el = data
          return idx*el
      
      my_list = [2,3,5,7]
      
      print(list(map(map_fn, list(enumerate(my_list)))))
      

      【讨论】:

        【解决方案5】:
        # Python3
        map(lambda args: print(args[0],args[1]) ,enumerate(a_list))
        # use arg list, just get the result with index
        
        # Python2
        map(lambda index,content: print(index,content) ,enumerate(a_list))
        

        【讨论】:

          猜你喜欢
          • 2020-10-10
          • 1970-01-01
          • 1970-01-01
          • 2022-01-17
          • 2011-08-17
          • 2023-01-10
          • 2011-12-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多