python使用lambda计算间隔使用lambda

时间:2012-03-08 15:53:10

标签: python lambda intervals reduce

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,还是我不能为太妃糖编码?请温柔。

4 个答案:

答案 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一起使用。