def tointervals(tlist):
count=0
for i in tlist:
if count == 0:
count = count + 1
yield 0
else:
count = count + 1
yield i - tlist[count -2]
我测试它是这样的:
In [272]: list(tointervals([1,2,3,4,10]))
Out[272]: [0, 1, 1, 1, 6]
很好,这正是我一直在寻找的
但我想以更实用的方式(我主要使用Scala)
我对此感到困惑,主要是因为对Python的不熟悉。在放弃终端混乱之前我最接近的就是这个。
In [292]: reduce(lambda x,y: (x[0] + [y - x[0][x[1]] ],x[1]+1), [1,2,3,4,10], ([0],0))
Out[292]: ([0, 1, 1, 2, 2, 8], 5)
这显然是错的,但那是我正在尝试的方向......我是愚蠢的,尝试使用reduce,还是我不能为太妃糖编码?请温柔。
答案 0 :(得分:4)
列表理解将更加pythonic:
>>> l = [1, 2, 3, 4, 10]
>>> [y-x for x, y in zip(l, l[1:])]
[1, 1, 1, 6]
答案 1 :(得分:2)
这是Pythonic方式,如果我理解你的意图是什么:
def tointervals(l):
return [0] + [l[i] - l[i-1] for i in xrange(1, len(l))]
或
def tointervals(l):
return (y-x for x,y in itertools.izip([l[0]] + l[:-1], l))
在Python社区中,函数式编程本身并不是一个目标,语言支持也是有限的 - "practicality beats purity"。
答案 2 :(得分:2)
我宁愿使用此线程中的一个更多pythonic解决方案,但如果你想看到基于reduce
的解决方案只是为了好玩,那就是这样的:
reduce(lambda x,y: (x[0] + [y-x[1]], y), [1,2,3,4,10], ([], 0))
请不要在现实代码中尝试,因为你的同事会诅咒你。
答案 3 :(得分:0)
在larsmans的回答基础上,您还可以像在程序代码中那样制作一个生成器:
def tointervals(xs):
return itertools.chain((0,), (xs[i] - xs[i-1] for i in range(1, len(xs))))
注意:将xrange
与python2一起使用。