这是下面的函数调用,我正在尝试构造函数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)
答案 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)
您可以结合zip
,map
和sum
来执行此操作:
def fee(vals):
x1 = zip(vals, vals[1:] + [vals[0]])
x2 = map(lambda t: (t[0] - t[1]) ** 2, x1)
return sum(x2)
说明:
zip(vals, vals[:-1] + [vals[0]])
将vals
合并到2元组对列表中。map(lambda t: (t[0] - t[1]) ** 2, x1)
对每个2元组元素执行数学运算。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