Dada uma lista de números, como encontrar diferenças entre cada ( i
) -ésimo elemento e seu ( i+1
) -ésimo elemento?
É melhor usar uma lambda
expressão ou talvez uma compreensão de lista?
Por exemplo:
Dada uma lista t=[1,3,6,...]
, o objetivo é encontrar uma 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)))
(após a importaçãoitertools
eoperator
).list(map(operator.sub, t[1:], t[:-1]))
servirá.As outras respostas estão corretas, mas se você estiver fazendo um trabalho numérico, considere o numpy. Usando numpy, a resposta é:
fonte
np.diff([2,4,9])
seria[2,5]
zip
versão?Se você não deseja usar
numpy
nemzip
, pode usar a seguinte solução:fonte
Você pode usar
itertools.tee
ezip
para construir o resultado de forma eficiente:Ou usando
itertools.islice
:Você também pode evitar o uso do
itertools
módulo:Todas essas soluções funcionam em espaço constante se você não precisa armazenar todos os resultados e suportar iteráveis infinitos.
Aqui estão alguns micro-benchmarks das soluções:
E as outras soluções propostas:
Observe que:
zip(L[1:], L)
é equivalente azip(L[1:], L[:-1])
uma vez quezip
já termina na entrada mais curta, porém evita uma cópia inteira deL
.numpy.diff
é lento porque primeiro precisa converter olist
em andarray
. Obviamente, se você começar com umndarray
, será muito mais rápido:fonte
islice(seq, 1, None)
vez deislice(seq, 1, len(seq))
fazê-lo funcionar com iteráveis infinitosUsando o
:=
operador walrus disponível no Python 3.8+:fonte
Eu sugeriria usar
isso é simples e fácil de ler.
Mas se você quiser
v
ter o mesmo comprimento quet
, em seguida,ou
FYI: isso só funcionará para listas.
para matrizes numpy
fonte
Uma abordagem funcional:
Usando gerador:
Usando índices:
fonte
Está bem. Acho que encontrei a solução adequada:
fonte
Solução com limites periódicos
Às vezes, com a integração numérica, você desejará diferenciar uma lista com condições de contorno periódicas (de modo que o primeiro elemento calcule a diferença até o último. Nesse caso, a função numpy.roll é útil:
Soluções com zero prefixado
Outra solução entorpecente (apenas para completar) é usar
Isso funciona como numpy.diff, mas apenas em um vetor (nivela a matriz de entrada). Ele oferece a capacidade de preceder ou acrescentar números ao vetor resultante. Isso é útil ao lidar com campos acumulados que geralmente são os fluxos de caso em variáveis meteorológicas (por exemplo, chuva, calor latente, etc.), pois você deseja uma lista resultante do mesmo comprimento da variável de entrada, com a primeira entrada intacta.
Então você escreveria
Claro, você também pode fazer isso com o comando np.diff, neste caso, embora você precise acrescentar zero à série com a palavra-chave prefixar:
Todas as soluções acima retornam um vetor com o mesmo comprimento da entrada.
fonte
O meu caminho
fonte
enumerate
é um desperdício porque você não está usandovalue
. Consulte stackoverflow.com/a/16714453/832230