【问题标题】:map lambda x,y with a constant x用常数 x 映射 lambda x,y
【发布时间】:2011-10-04 12:21:43
【问题描述】:

map 两个参数lambda 函数转换为第一个参数为常量而第二个参数取自list 的值列表的优雅方法是什么?

示例:

lambda x,y: x+y
x='a'
y=['2','4','8','16']

预期结果:

['a2','a4','a8','a16']

注意事项:

  • 这只是一个例子,实际的lambda函数更复杂
  • 假设我不能使用列表理解

【问题讨论】:

    标签: python map lambda


    【解决方案1】:

    您可以使用itertools.starmap

    a = itertools.starmap(lambda x,y: x+y, zip(itertools.repeat(x), y))
    a = list(a)
    

    你会得到你想要的输出。

    顺便说一句,itertools.imap 和 Python3 的 map 都将接受以下内容:

    itertools.imap(lambda x,y: x+y, itertools.repeat(x), y)
    

    默认Python2的map不会停在y的末尾,会插入Nones...


    但是理解要好很多

    [x + num for num in y]
    

    【讨论】:

    • +1 用于建议 pythonic 列表理解而不是粗略的地图函数(= -- 尽管我刚刚注意到提问者说“假设我不能使用列表理解”
    【解决方案2】:

    你也可以为此使用闭包

    x='a'
    f = lambda y: x+y
    map(f, ['1', '2', '3', '4', '5'])
    >>> ['a1', 'a2', 'a3', 'a4', 'a5']
    

    【讨论】:

      【解决方案3】:

      Python 2.x

      from itertools import repeat
      
      map(lambda (x, y): x + y, zip(repeat(x), y))
      

      Python 3.x

      map(lambda xy: ''.join(xy), zip(repeat(x), y))
      

      【讨论】:

      • @JBernardo,他们把“签名解包”拿走了吗?我似乎记得类似的东西。
      • 是的,这就是为什么我在回答中建议starmap
      【解决方案4】:
      def prependConstant(x, y):
        return map(lambda yel: x + yel, y)
      

      【讨论】:

        【解决方案5】:
        ['a' + x for x in y]
        

        或者如果你真的需要一个可调用对象:

        def f(x, y):
            return x + y
        
        [f('a', x) for x in y]
        

        【讨论】:

          【解决方案6】:

          你必须使用 lambda 吗?

          >>> x='a'
          >>> y=['2','4','8','16']
          >>> map(x.__add__, y)
          ['a2', 'a4', 'a8', 'a16']
          >>> 
          

          【讨论】:

            【解决方案7】:

            顺便说一句,itertools.imap 和 Python3 的地图都将接受以下内容:

            itertools.imap(lambda x,y: x+y, itertools.repeat(x), y) 默认 Python2 的 map 不会停在 y 的末尾,会插入 Nones...

            我只是想补充一下这个答案,在 python 2.x 中你可以做类似的事情

            map(lambda x,y: x+y, itertools.repeat(x, len(y)))
            

            让 itertools 停止迭代。

            【讨论】:

              猜你喜欢
              • 2023-01-05
              • 1970-01-01
              • 1970-01-01
              • 2016-11-02
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多