Dada una lista de números, ¿cómo se encuentran las diferencias entre cada ( i) -ésimo elemento y su ( i+1) -ésimo?
¿Es mejor usar una lambdaexpresión o quizás una lista de comprensión?
Por ejemplo:
Dada una lista t=[1,3,6,...], el objetivo es encontrar una lista v=[2,3,...]porque 3-1=2, 6-3=3, etc.

[abs(j-i) for i,j in zip(t, t[1:])]list(itertools.starmap(operator.sub, zip(t[1:], t)))(después de importaritertoolsyoperator).list(map(operator.sub, t[1:], t[:-1]))servirá.Las otras respuestas son correctas, pero si está haciendo un trabajo numérico, es posible que desee considerar numpy. Usando numpy, la respuesta es:
fuente
np.diff([2,4,9])sería[2,5]zipversión?Si no desea utilizar
numpynizip, puede utilizar la siguiente solución:fuente
Puede usar
itertools.teeyzippara generar el resultado de manera eficiente:O usando en su
itertools.islicelugar:También puede evitar usar el
itertoolsmódulo:Todas estas soluciones funcionan en un espacio constante si no necesita almacenar todos los resultados y admitir iterables infinitos.
A continuación, se muestran algunos microevaluaciones de las soluciones:
Y las otras soluciones propuestas:
Tenga en cuenta que:
zip(L[1:], L)es equivalente azip(L[1:], L[:-1])ya quezipya termina en la entrada más corta, sin embargo, evita una copia completa deL.numpy.diffes lento porque primero tiene que convertir el archivolistandarray. Obviamente, si comienzas con unndarrayserá mucho más rápido:fuente
islice(seq, 1, None)lugar deislice(seq, 1, len(seq))hacerlo funcionar con iterables infinitosUsando el
:=operador de morsa disponible en Python 3.8+:fuente
Sugeriría usar
esto es simple y fácil de leer.
Pero si quieres
vtener la misma longitud quetentonceso
FYI: esto solo funcionará para listas.
para matrices numpy
fuente
Un enfoque funcional:
Usando generador:
Usando índices:
fuente
Okay. Creo que encontré la solución adecuada:
fuente
Solución con límites periódicos
A veces, con la integración numérica, querrá diferenciar una lista con condiciones de contorno periódicas (por lo que el primer elemento calcula la diferencia con el último. En este caso, la función numpy.roll es útil:
Soluciones con cero antepuesto
Otra solución numpy (solo para completar) es usar
Esto funciona como numpy.diff, pero solo en un vector (aplana la matriz de entrada). Ofrece la posibilidad de anteponer o añadir números al vector resultante. Esto es útil cuando se manejan campos acumulados que a menudo es el caso de los flujos en las variables meteorológicas (por ejemplo, lluvia, calor latente, etc.), ya que desea una lista resultante de la misma longitud que la variable de entrada, con la primera entrada intacta.
Entonces escribirías
Por supuesto, también puede hacer esto con el comando np.diff, en este caso, aunque debe anteponer cero a la serie con la palabra clave anteponer:
Todas las soluciones anteriores devuelven un vector que tiene la misma longitud que la entrada.
fuente
Mi manera
fuente
enumeratees un desperdicio porque no estás usandovalue. Ver stackoverflow.com/a/16714453/832230