Ответ 1
max(abs(x - y) for (x, y) in zip(values[1:], values[:-1]))
У меня есть список целых чисел, то есть:
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
Есть ли более быстрый способ сделать это? Это занимает некоторое время.
max(abs(x - y) for (x, y) in zip(values[1:], values[:-1]))
Это больше похоже на рекламу блестящей 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))
Попробуйте выбрать некоторые из них с помощью модуля 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
>>>
С уменьшением (уродливым, я думаю)
>>> 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
Я попробовал пост инициалов в моей программе на python (потому что список, который я использую, довольно мал), но когда я вычитал свое значение из предыдущего значения, я получаю сообщение об ошибке, говорящее, что операнд не поддерживается. Как я могу это исправить?