Учитывая список чисел, как найти различия между каждым ( i
) -м элементом и его ( i+1
) -м?
Лучше использовать lambda
выражение или, может быть, понимание списка?
Например:
Учитывая список t=[1,3,6,...]
, цель состоит в том, чтобы найти список, v=[2,3,...]
потому что 3-1=2
, 6-3=3
и т. Д.
[abs(j-i) for i,j in zip(t, t[1:])]
list(itertools.starmap(operator.sub, zip(t[1:], t)))
(после импортаitertools
иoperator
).list(map(operator.sub, t[1:], t[:-1]))
подойдет.Другие ответы верны, но если вы выполняете числовую работу, вы можете подумать о numpy. Используя numpy, ответ:
источник
np.diff([2,4,9])
будет[2,5]
zip
версии?Если вы не хотите использовать
numpy
ниzip
, вы можете использовать следующее решение:источник
Вы можете использовать
itertools.tee
иzip
для эффективного построения результата:Или используя
itertools.islice
вместо этого:Вы также можете избежать использования
itertools
модуля:Все эти решения работают в постоянном пространстве, если вам не нужно хранить все результаты и поддерживать бесконечное количество итераций.
Вот несколько микротестов решений:
И другие предлагаемые решения:
Обратите внимание, что:
zip(L[1:], L)
эквивалентно,zip(L[1:], L[:-1])
посколькуzip
уже завершается на кратчайшем вводе, однако избегает полной копииL
.numpy.diff
это медленно , потому что он должен сначала преобразоватьlist
кndarray
. Очевидно, что если вы начнете с a,ndarray
это будет намного быстрее:источник
islice(seq, 1, None)
вместо того , чтобыislice(seq, 1, len(seq))
заставить его работать с бесконечными итерациямиИспользование
:=
оператора моржа, доступного в Python 3.8+:источник
Я бы предложил использовать
это просто и легко читать.
Но если вы хотите
v
иметь ту же длину, что иt
тогдаили
К вашему сведению: это будет работать только для списков.
для массивов numpy
источник
Функциональный подход:
Используя генератор:
Используя индексы:
источник
Хорошо. Думаю, я нашел правильное решение:
источник
Решение с периодическими границами
Иногда при численном интегрировании вам может понадобиться различать список с периодическими граничными условиями (так, чтобы первый элемент вычислял разницу до последнего. В этом случае полезна функция numpy.roll:
Решения с нулем в начале
Другое решение numpy (просто для полноты) - использовать
Это работает как numpy.diff, но только с вектором (выравнивает входной массив). Он предлагает возможность добавлять числа к результирующему вектору. Это полезно при работе с накопленными полями, которые часто являются потоками в метеорологических переменных (например, дождь, скрытая высокая температура и т. Д.), Поскольку вы хотите получить результирующий список той же длины, что и входная переменная, с нетронутой первой записью.
Тогда вы бы написали
Конечно, вы также можете сделать это с помощью команды np.diff, хотя в этом случае вам нужно добавить ноль к серии с ключевым словом prepend:
Все приведенные выше решения возвращают вектор той же длины, что и вход.
источник
Мой путь
источник
enumerate
расточительно, потому что вы не используетеvalue
. См stackoverflow.com/a/16714453/832230