Поиск наибольшей дельта между двумя целыми числами в списке в python

У меня есть список целых чисел, то есть:

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

Я пытаюсь найти самую большую разницу между двумя последовательными числами. В этом случае это будет 15 из 64- > 79. Цифры могут быть отрицательными или положительными, увеличиваться или уменьшаться, или и то, и другое. Важно то, что мне нужно найти самую большую дельту между двумя последовательными номерами.

Каков самый быстрый способ сделать это? Эти списки могут содержать от сотни до тысяч целых чисел.

Изменить: это код, который у меня есть прямо сейчас:

    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

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

Ответ 2

Это больше похоже на рекламу блестящей recipes в справке Python itertools.

В этом случае используйте попарно, как показано в справке, связанной выше.

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

Ответ 3

Попробуйте выбрать некоторые из них с помощью модуля 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
>>>

Ответ 4

С уменьшением (уродливым, я думаю)

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

Ответ 5

Я попробовал пост инициалов в моей программе на python (потому что список, который я использую, довольно мал), но когда я вычитал свое значение из предыдущего значения, я получаю сообщение об ошибке, говорящее, что операнд не поддерживается. Как я могу это исправить?