Eu tenho agora:
list1 = [1, 2, 3]
list2 = [4, 5, 6]
Eu gostaria de ter:
[1, 2, 3]
+ + +
[4, 5, 6]
|| || ||
[5, 7, 9]
Simplesmente uma adição elemento a elemento de duas listas.
Certamente posso repetir as duas listas, mas não quero fazer isso.
Qual é a maneira mais pitônica de fazer isso?
python
list
elementwise-operations
Sibbs Gambling
fonte
fonte
Respostas:
Use
map
comoperator.add
:ou
zip
com uma compreensão da lista:Comparações de tempo:
fonte
map
tornará mais importante ao longo do tempo. O Python 2 perderá o suporte oficial em menos de 3 anos.Os outros deram exemplos de como fazer isso em python puro. Se você quiser fazer isso com matrizes com 100.000 elementos, use numpy:
Fazer a adição elemento a elemento agora é tão trivial quanto
assim como no Matlab.
Tempo para comparar com a versão mais rápida do Ashwini:
Portanto, este é um fator 25 mais rápido! Mas use o que se adequa à sua situação. Para um programa simples, você provavelmente não deseja instalar o numpy, então use o python padrão (e acho a versão de Henry a mais Pythonic). Se você estiver em trituração séria de números,
numpy
faça o trabalho pesado. Para os loucos por velocidade: parece que a solução numpy é mais rápidan = 8
.fonte
fonte
[sum(x) for x in zip(list1, list2)]
é o mesmo que sua resposta, não é? :)Conforme descrito por outros, uma solução rápida e também eficiente em termos de espaço está usando o numpy (np) com sua capacidade de manipulação de vetores integrada:
1. Com Numpy
2. Com embutidos
2.1 Lambda
Observe que map () suporta vários argumentos.
2.2 compreensão de zip e lista
fonte
É mais simples de usar
numpy
da minha opinião:Resultados:
Para informações detalhadas sobre parâmetros, verifique aqui: numpy.add
fonte
Talvez "a maneira mais pitônica" deva incluir lidar com o caso em que list1 e list2 não sejam do mesmo tamanho. A aplicação de alguns desses métodos dará uma resposta silenciosa. A abordagem numpy permitirá que você saiba, provavelmente com um ValueError.
Exemplo:
Qual resultado você pode querer se isso estiver relacionado a uma função no seu problema?
fonte
zip_longest
itertools com umfillvalue
de0
.Isso é simples com
numpy.add()
Veja o documento aqui
Se você deseja receber uma lista python:
fonte
Isso funcionará para 2 ou mais listas; iterando pela lista de listas, mas usando adição numpy para lidar com elementos de cada lista
fonte
Talvez isso seja python e um pouco útil se você tiver um número desconhecido de listas e sem importar nada.
Desde que as listas tenham o mesmo comprimento, você pode usar a função abaixo.
Aqui, o * args aceita um número variável de argumentos da lista (mas apenas soma o mesmo número de elementos em cada um).
O * é usado novamente na lista retornada para descompactar os elementos em cada uma das listas.
Resultado:
Ou com 3 listas
Resultado:
fonte
Use o mapa com a função lambda:
fonte
Eu não cronometrei, mas suspeito que isso seria bem rápido:
fonte
Se você precisar lidar com listas de tamanhos diferentes, não se preocupe! O maravilhoso módulo de ferramentas tem você coberto:
No Python 2,
zip_longest
é chamadoizip_longest
.Veja também esta resposta relevante e comente outra pergunta .
fonte
fonte
[a + b for (a, b) in zip(list1, list2)]
Embora a questão real não queira percorrer a lista para gerar o resultado, mas todas as soluções propostas fazem exatamente isso por baixo do capô!
Para atualizar: Você não pode adicionar dois vetores sem examinar todos os elementos do vetor. Portanto, a complexidade algorítmica da maioria dessas soluções é Big-O (n). Onde n é a dimensão do vetor.
Portanto, do ponto de vista algorítmico, o uso de um loop for para gerar iterativamente a lista resultante também é lógico e pitônico. No entanto, além disso, esse método não tem a sobrecarga de chamar ou importar nenhuma biblioteca adicional.
Os horários que estão sendo mostrados / discutidos aqui são dependentes do sistema e da implementação e não podem ser medidas confiáveis para medir a eficiência da operação. De qualquer forma, a grande complexidade de O da operação de adição de vetores é linear, significando O (n).
fonte
fonte