将函数的参数(一个lambda)映射到元组?

时间:2015-08-19 19:55:57

标签: python lambda functional-programming reduce

这是下面的函数调用,我正在尝试构造函数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)

3 个答案:

答案 0 :(得分:3)

您可以使用python built-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)]

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

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

答案 1 :(得分:1)

您可以结合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的结果汇总在一起。

答案 2 :(得分:0)

这应该这样做:

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