Eu tenho esta lista aninhada:
l = [['40', '20', '10', '30'], ['20', '20', '20', '20', '20', '30', '20'], ['30', '20', '30', '50', '10', '30', '20', '20', '20'], ['100', '100'], ['100', '100', '100', '100', '100'], ['100', '100', '100', '100']]
Agora, o que eu quero fazer é converter cada elemento em uma lista para flutuar. Minha solução é esta:
newList = []
for x in l:
for y in x:
newList.append(float(y))
Mas isso pode ser feito usando compreensão de lista aninhada, certo?
o que eu fiz é:
[float(y) for y in x for x in l]
Mas o resultado é um monte de 100 com a soma de 2400.
qualquer solução, uma explicação seria muito apreciada. Obrigado!
python
list
nested
list-comprehension
Boy Pasmo
fonte
fonte
Respostas:
Aqui está como você faria isso com uma compreensão de lista aninhada:
Isso forneceria uma lista de listas, semelhante à que você começou, exceto com flutuadores em vez de cadeias. Se você quiser uma lista simples, então usaria
[float(y) for x in l for y in x]
.fonte
Aqui está como converter o nested for loop em compreensão de lista aninhada:
Aqui está como a compreensão da lista aninhada funciona:
Para o seu caso, será algo parecido com isto.
fonte
(f(x) for x in l)
coloca a segunda linha do equivalente for-loop à esquerda.fonte
Não tenho certeza qual é a saída desejada, mas se você estiver usando a compreensão da lista, a ordem seguirá a ordem dos loops aninhados, que você tem para trás. Então, eu tenho o que eu acho que você quer com:
O princípio é: use a mesma ordem que você usaria para escrevê-lo como aninhado para loops.
fonte
Como estou um pouco atrasado aqui, mas queria compartilhar como realmente funciona a compreensão da lista, especialmente a compreensão da lista aninhada:
é realmente o mesmo que:
E agora compreensão de lista aninhada:
é o mesmo que;
resultado:
fonte
Se você não gosta da compreensão de listas aninhadas, também pode usar a função de mapa ,
fonte
>>> float_l = [map(float, nested_list) for nested_list in l]
[[<map at 0x47be9b0>], [<map at 0x47be2e8>], [<map at 0x47be4a8>], [<map at 0x47beeb8>], [<map at 0x484b048>], [<map at 0x484b0b8>]]
mas acrescentando uma chamada adicional à lista funciona como esperado:>>> float_l = [list(map(float, nested_list)) for nested_list in l]
python3
para devolver geradores fora de compreensão.Eu tinha um problema semelhante para resolver, então me deparei com essa pergunta. Fiz uma comparação de desempenho das respostas de Andrew Clark e Narayan que gostaria de compartilhar.
A principal diferença entre duas respostas é como elas iteram nas listas internas. Um deles usa o mapa interno , enquanto outro está usando a compreensão da lista. A função de mapa tem uma pequena vantagem de desempenho para sua compreensão equivalente da lista, se não exigir o uso de lambdas . Portanto, no contexto desta questão
map
, o desempenho deve ser um pouco melhor que a compreensão da lista.Vamos fazer um benchmark de desempenho para ver se é realmente verdade. Eu usei o python versão 3.5.0 para realizar todos esses testes. No primeiro conjunto de testes, eu gostaria de manter os elementos por lista em 10 e variar o número de listas de 10 a 100.000
No próximo conjunto de testes, gostaria de aumentar o número de elementos por lista para 100 .
Vamos dar um passo corajoso e modificar o número de elementos nas listas para 1000
A partir desses testes, podemos concluir que
map
há um benefício de desempenho sobre a compreensão da lista nesse caso. Isso também é aplicável se você estiver tentando transmitir para umint
ou outrostr
. Para um pequeno número de listas com menos elementos por lista, a diferença é insignificante. Para listas maiores com mais elementos por lista, pode-se usar emmap
vez da compreensão da lista, mas isso depende totalmente das necessidades do aplicativo.No entanto, eu pessoalmente acho a compreensão da lista mais legível e idiomática do que
map
. É um padrão de fato em python. Geralmente, as pessoas são mais eficientes e confortáveis (especialmente iniciantes) no uso da compreensão de listas do quemap
.fonte
Sim, você pode fazer isso com esse código:
fonte
[float(y) for y in x for x in l]
isso resultaria para um bando de 100 Com uma soma de 2400.Este problema pode ser resolvido sem o uso do loop for. O código de linha única será suficiente para isso. O uso do Mapa Aninhado com a função lambda também funciona aqui.
E a lista de saída seria a seguinte:
fonte
A melhor maneira de fazer isso na minha opinião é usar o
itertools
pacote do python .fonte
Sim, você pode fazer o seguinte.
fonte
Isso pode ser alcançado usando a compreensão da lista:
fonte