我有一个整数列表,即:
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
有更快的方法吗?这需要一段时间。
答案 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), ...]