Eu tenho uma lista com seqüências numéricas, assim:
numbers = ['1', '5', '10', '8'];
Gostaria de converter todos os elementos da lista em números inteiros, assim ficaria assim:
numbers = [1, 5, 10, 8];
Eu poderia fazer isso usando um loop, assim:
new_numbers = [];
for n in numbers:
new_numbers.append(int(n));
numbers = new_numbers;
Tem que ser tão feio? Tenho certeza de que há uma maneira mais pitônica de fazer isso em uma linha de código. Por favor, me ajude.
Respostas:
É para isso que servem as compreensões de lista :
fonte
No Python 2.x, outra abordagem é usar
map
:Nota: no Python 3.x
map
retorna um objeto de mapa que você pode converter em uma lista, se desejar:fonte
map
retorna um iterador em vez de uma lista, portanto, ele precisa ser escrito comolist(map(int, numbers))
se fosse necessária uma lista.map
possui uma sobrecarga de configuração mais alta, mas no interpretador de referência, se a função de transformação for uma função interna do Python implementada em C, ela terá um custo menor por item. Testar em uma entrada de apenas quatro valores não fornecerá informações úteis sobre dimensionamento. Dito isto, em meus próprios testes (no Py2.7.12 e Py3.5.2, o último comlist()
quebra automática), o Py2map
venceu até por quatro entradas de elementos e perde apenas uma pequena margem no Py3; Eu suspeito que seus testes foram distorcidos em favor dos listcomps.apenas um ponto
a compreensão da lista é mais natural, enquanto
é mais rápido.
Provavelmente isso não importa na maioria dos casos
Leitura útil: LP vs map
fonte
Se você pretende passar esses números inteiros para uma função ou método, considere este exemplo:
Essa construção é intencionalmente notavelmente semelhante às compreensões de lista mencionadas por adamk. Sem os colchetes, isso é chamado de expressão geradora e é uma maneira muito eficiente em termos de memória de passar uma lista de argumentos para um método. Uma boa discussão está disponível aqui: Expressões do Gerador vs. Compreensão da Lista
fonte
Outra maneira de fazê-lo no Python 3:
numbers = [*map(int, numbers)]
fonte
[]
uma lista de argumentos. E eu não sabia que você poderia passar um iterador como uma lista de argumentos. Eu teria pensado em fazernumber = list(map(int, numbers))
. Mas obrigado pela explicação!De outra maneira
fonte
Pensei em consolidar as respostas e mostrar alguns
timeit
resultados.O Python 2 é péssimo nisso, mas
map
é um pouco mais rápido que a compreensão.O Python 3 é 4x mais rápido por si só, mas converter o
map
objeto gerador em uma lista ainda é mais rápido que a compreensão, e criar a lista descompactando omap
gerador (obrigado Artem!) É um pouco mais rápido ainda.Nota: No Python 3, 4 elementos parecem ser o ponto de cruzamento (3 no Python 2), onde a compreensão é um pouco mais rápida, embora a descompactação do gerador seja ainda mais rápida do que nas listas com mais de 1 elemento.
fonte