2010-08-07 68 views
12

我有一個整數列表,即:找到兩個整數之間的最大增量在列表中的蟒蛇

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 

有一個更快的方法來做到這一點?這需要一段時間。

+1

你的代碼失敗,如果增量都是負的;它返回零。 – 2010-08-07 01:36:51

回答

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

雖然這樣大的列表,使用'itertools.izip'來避免構建內存中的元組列表 – aaronasterling 2010-08-07 01:27:04

+0

這真的很漂亮:-) – 2010-08-07 01:27:18

+1

我_still_不能習慣這個「新」Ptyhon。我美麗可讀的語言發生了什麼? :-) – paxdiablo 2010-08-07 01:29:06

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 
>>> 
2

這更是作爲在Python itertools幫助輝煌recipes廣告。

在這種情況下,請按上面鏈接的幫助中所示使用pairwise。

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

隨着降低(醜陋的我猜的)

>>> 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