在python中查找列表中两个整数之间的最大增量

时间:2010-08-07 01:20:20

标签: python

我有一个整数列表,即:

values = [55, 55, 56, 57, 57, 57, 57, 62, 63, 64, 79, 80]

我试图找到两个连续数字之间的最大差异。在这种情况下,从64-> 79将是15。数字可以是负数或正数,增加或减少或两者兼而有之。重要的是我需要找到两个连续数字之间的最大增量。

最快的方法是什么?这些列表可以包含数百到数千个整数。

编辑:这是我现在的代码:

    prev_value = values[0]
    largest_delta = 0

    for value in values:
            delta = value - prev_value
            if delta > largest_delta:
                    largest_delta = delta
            prev_value = value

    return largest_delta

有更快的方法吗?这需要一段时间。

5 个答案:

答案 0 :(得分:23)

max(abs(x - y) for (x, y) in zip(values[1:], values[:-1]))

答案 1 :(得分:3)

这更像是Python itertools帮助中辉煌recipes的广告。

在这种情况下,使用成对,如上面链接的帮助所示。

from itertools import tee, izip

def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = tee(iterable)
    next(b, None)
    return izip(a, b)

values = [55, 55, 56, 57, 57, 57, 57, 62, 63, 64, 79, 80]

print max(b - a for a,b in pairwise(values))

答案 2 :(得分:2)

尝试使用timeit模块计时其中一些:

>>> values = [55, 55, 56, 57, 57, 57, 57, 62, 63, 64, 79, 80]
>>> max(values[i+1] - values[i] for i in xrange(0, len(values) - 1))
15
>>> max(v1 - v0 for v0, v1 in zip(values[:-1], values[1:]))
15
>>> from itertools import izip, islice
>>> max(v1 - v0 for v0, v1 in izip(values[:-1], values[1:]))
15
>>> max(v1 - v0 for v0, v1 in izip(values, islice(values,1,None)))
15
>>>

答案 3 :(得分:2)

使用reduce(丑陋我猜)

>>> foo = [5, 5, 5, 5, 8, 8, 9]    
>>> print reduce(lambda x, y: (max(x[0], y - x[1]), y), foo, (0, foo[0]))[0]
3

答案 4 :(得分:0)

随着即将到来的Python 3.10 release schedule ,新的pairwise函数提供了一种方法,可以在成对的连续元素之间滑动,从而找到它们之间的每个差异:

from itertools import pairwise

# values = [55, 55, 56, 57, 57, 57, 57, 62, 63, 64, 79, 80]
max(abs(x-y) for x, y in pairwise(values))
# 15

pairwise的中间结果:

pairwise([55, 55, 56, 57, 57, 57, 57, 62, 63, 64, 79, 80])
# [(55, 55), (55, 56), (56, 57), (57, 57), (57, 57), (57, 57), ...]