我有一个场景,其中给出了两个数字。我不断发现它们的平均值或某些功能达到不同的水平。
例如:
Input I = 2, 64
I1=2, 33=f(2,64), 64
I1=2, 33, 64
I2=2, 17=f(2,33), 33, 49=f(33,64), 64
I2=2,17,33,49,64
I3=2,9=f(2,17),17,25=f(17,33),33,41=f(33,49),49,57=f(49,64),64
I3=2,9,17,25,33,41,49,57,64
在第一次迭代中,应用函数f(2,64)来查找中间值 - 在本例中为33.然后写出结果序列;现在三个要素很长。在下一个传球中,你将你的函数应用到(2,33)给17,到(33,64)给49.等等。 - 编辑Floris的帮助
任何能够有效地对此进行编码的算法?
答案 0 :(得分:1)
from itertools import izip_longest
def apply_pairwise(lst, f, loops=1):
if loops == 0:
return lst
new_lst = [f(a,b) for a,b in zip(lst, lst[1:])]
next_lst = [e for t in izip_longest(lst, new_lst) for e in t if e]
return apply_pairwise(next_lst, f, loops-1)
然后,您可以指定要使用的任何成对函数,它具有两个值,
>>> apply_pairwise([2, 64], lambda x,y: (x+y)/2.0, 3)
[2, 9.75, 17.5, 25.25, 33.0, 40.75, 48.5, 56.25, 64]