【问题标题】:Map a function's argument, which is a lambda, to a tuple?将函数的参数(即 lambda)映射到元组?
【发布时间】:2015-11-13 06:50:29
【问题描述】:

这是下面的函数调用,我正在尝试构造函数fee,我需要使用函数 prog 映射元组。这样就变成了(6-7)**2 + (7-1)**2 + (1-4)**2,最后一个是(4-6)**2。然后我将这些相加并在fee 中返回这个值。

fee((6, 7, 1, 4), lambda x, y: (x-y) ** 2)

【问题讨论】:

  • 什么是功能费?
  • 玩具能否通过输入/输出示例阐明您的要求?
  • 欢迎来到 Stack Overflow,奶酪。 SO 是一个问答网站。读者,比如你自己,提出问题,而其他读者试图回答这些问题。您的帖子缺少一个关键要素:一个问题。您有具体问题吗?
  • fee = lambda t: sum((x-y)**2 for x, y in zip(t, t[1:]+(t[0],)))

标签: python lambda functional-programming reduce


【解决方案1】:

你可以玩pythonbuilt-in functions

>>> def fee(tup):
...    return sum(map(lambda x,y:(x-y)**2,tup,tup[1:]+(tup[0],)))

演示:

>>> t=(6, 7, 1, 4)
>>> fee(t)
50

您可以使用map 函数对对应用lambda 函数并对结果求和:

>>> zip(t,t[1:]+(t[0],))
[(6, 7), (7, 1), (1, 4), (4, 6)]

您可以在sum 中使用zip 和生成器表达式,而不是map 作为一种更有效的方式:

>>> def fee(tup):
...    return sum((x-y)**2 for x,y in zip(tup,tup[1:]+(tup[0],))))

【讨论】:

  • 您不必显式压缩。由于map 的第一个参数是一个带有两个参数的函数,因此您可以将两个元组作为单独的参数传递:map(lambda x, y: ..., tup, tup[1:] + (tup[0],))
  • 列表理解使它成为一个有实际意义的问题,虽然 :) 这比在这里使用 map 要好得多。
  • 在你的第一个 sum 和 map 解决方案中,map 会采用任何元组长度吗?
  • @Cheese 是的,实际上这取决于你的内存限制!
【解决方案2】:

您可以将zipmapsum 组合使用:

def fee(vals):
    x1 = zip(vals, vals[1:] + [vals[0]])
    x2 = map(lambda t: (t[0] - t[1]) ** 2, x1)
    return sum(x2)

解释:

  1. zip(vals, vals[:-1] + [vals[0]])vals 组合成一个 2 元组对列表。
  2. map(lambda t: (t[0] - t[1]) ** 2, x1) 对每个 2 元组元素执行数学运算。
  3. sum(x2) 将 #2 的结果相加。

【讨论】:

    【解决方案3】:

    应该这样做:

    from itertools import tee
    
    try:
        from itertools import izip as zip  # Python 2
    except ImportError:
        pass  # Python 3
    
    
    # An itertools recipe
    # https://docs.python.org/3/library/itertools.html#itertools-recipes
    def pairwise(iterable):
        "s -> (s0,s1), (s1,s2), (s2, s3), ..."
        a, b = tee(iterable)
        next(b, None)
        return zip(a, b)
    
    
    def fee(args, func):
        last_value = func(args[-1], args[0])
        return sum(func(x, y) for x, y in pairwise(args)) + last_value
    
    
    print(fee((6, 7, 1, 4), lambda x, y: (x-y) ** 2))  # 50
    

    【讨论】:

      猜你喜欢
      • 2020-12-24
      • 2021-03-28
      • 1970-01-01
      • 2018-08-03
      • 1970-01-01
      • 2011-04-28
      • 2016-05-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多