As compreensões de lista fornecem uma maneira de escrever for
loops de forma mais concisa. Eles podem ser úteis quando você deseja criar novas listas a partir de listas existentes ou iteráveis. Por exemplo, você pode usar compreensões de lista para criar uma lista de quadrados de uma lista de números. Da mesma forma, você também pode usar algumas condições em uma lista de números para que a nova lista criada seja um subconjunto da lista original.
Tenha em mente que você não pode escrever todos os for
loop como uma compreensão de lista. Mais uma coisa: o nome “compreensão de listas” pode ser um pouco confuso porque parece sugerir que as compreensões são apenas para trabalhar com listas. Na realidade, a palavra “lista” em compreensões de lista é usada para indicar que você pode fazer um loop sobre qualquer iterável em Python e o produto final seria uma lista.
Loops e compreensões de lista
As compreensões de lista básicas que não usam nenhuma condição têm o seguinte formato:
[for in ]
Vamos começar escrevendo um muito básico for
loop para listar os primeiros 15 múltiplos de 5. Primeiro, você precisa criar uma lista vazia. Então, você deve iterar em um intervalo de números e multiplicá-los por 5. A nova sequência de números obtida consistirá em múltiplos de 5.
multiples = [] for n in range(1,16): multiples.append(n*5) print(multiples) # [5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75]
O de cima for
loop basicamente tem a seguinte estrutura:
forin :
Se você comparar com o formulário de compreensão de lista que você leu anteriormente, você pode ver que
é n
,
é range(1,16)
e
é n*5
. Colocar esses valores na compreensão da lista nos dará o seguinte resultado:
multiples = [n*5 for n in range(1,15)] multiples # [5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70]
Da mesma forma, você também pode obter uma lista com o cubo de números fornecidos como este:
cubes = [n**3 for n in range(1,16)] print(cubes) #[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000, 1331, 1728, 2197, 2744, 3375]
Condições nas compreensões da lista
Você também pode usar um if
condição para filtrar determinados valores da lista final. Nesse caso, a compreensão da lista assume a seguinte forma:
[for in if ]
Um exemplo básico desse tipo de compreensão seria obter todos os números pares em um determinado intervalo. UMA for
loop para fazer esta tarefa ficará assim:
evens = [] for n in range(1,21): if n%2 == 0: evens.append(n) print(evens) # [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
A mesma coisa também pode ser realizada usando a seguinte compreensão de lista:
evens = [n for n in range(1,21) if n%2 == 0] print(evens) # [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
Um exemplo mais complexo de usar compreensões de lista seria adicionar .. if .. else ..
expressões condicionais dentro deles.
Nesse caso, a ordem em que você apresenta as instruções dentro da compreensão da lista será diferente da usual if
condições. Quando você tem apenas um if
condição, a condição vai até o final da compreensão. No entanto, no caso de um .. if .. else ..
expressão, as posições do for
loop e a expressão condicional são trocados. A nova ordem é:
[if else for in ]
Vamos começar escrevendo o verbose .. if .. else ..
expressão condicional para obter quadrados de números pares e cubos de números ímpares em um determinado intervalo.
squares_cubes = [] for n in range(1,16): if n%2 == 0: squares_cubes.append(n**2) else: squares_cubes.append(n**3) print(squares_cubes) # [1, 4, 27, 16, 125, 36, 343, 64, 729, 100, 1331, 144, 2197, 196, 3375]
A expressão condicional acima tem a seguinte estrutura:
forin : if : else:
Colocar os valores correspondentes nos lugares certos fornecerá a seguinte compreensão de lista:
squares_cubes = [n**2 if n%2 == 0 else n**3 for n in range(1,16)] print(squares_cubes) # [1, 4, 27, 16, 125, 36, 343, 64, 729, 100, 1331, 144, 2197, 196, 3375]
Listar compreensões para loops aninhados
Você também pode usar loops aninhados em uma compreensão de lista. Não há limite para o número de for
loops que você pode colocar dentro de uma compreensão de lista. No entanto, você deve ter em mente que a ordem dos loops deve ser a mesma no código original e na compreensão da lista. Você também pode adicionar um opcional if
condição após cada for
ciclo. Uma compreensão de lista com aninhada for
loops terão a seguinte estrutura:
[for in (optional if ) for in (optional if ) for in (optional if ) ... and so on ...]
Os exemplos a seguir devem deixar tudo mais claro. Existem dois laços aninhados, e multiplicá-los nos dá tabelas de multiplicação.
multiplications = [] for i in range(1, 4): for n in range(1, 11): multiplications.append(i*n) print(multiplications) # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30]
Estes aninhados for
loops podem ser reescritos como:
forin : for in :
Depois de escrever o loop neste formulário, é fácil convertê-lo em uma compreensão de lista:
multiplications = [i*n for i in range(1,4) for n in range(1,11)] print(multiplications) # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30]
Você também pode usar uma compreensão de lista escrita semelhante para achatar uma lista de listas. O exterior for
loop itera através de listas individuais e as armazena na variável row
. O interior for
loop irá então iterar através de todos os elementos na corrente row
. Durante a primeira iteração, a variável row
tem o valor [1, 2, 3, 4]
. O segundo loop itera por esta lista ou row
e anexa todos esses valores à lista final.
matrix = [ [1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], ] flatten = [n for row in matrix for n in row] print(flatten) #[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
Compreensão de lista aninhada
As compreensões de lista aninhada podem parecer semelhantes às compreensões de lista com loops aninhados, mas são muito diferentes. No primeiro caso, você estava lidando com loops dentro de loops. Neste caso, você estará lidando com compreensões de lista dentro de compreensões de lista. Um bom exemplo de uso de compreensão de lista aninhada seria criar uma transposição da matriz para a seção anterior.
Sem uma expressão de compreensão de lista, você precisará usar duas for
loops para criar a transposição.
matrix = [ [1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], ] transpose = [] for i in range(4): temp = [] for row in matrix: temp.append(row[i]) transpose.append(temp) print(transpose) # [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
O loop externo percorre a matriz quatro vezes porque há quatro colunas nele. O loop interno itera pelos elementos dentro da linha atual, um índice por vez, e o anexa a uma lista temporária chamada temp
. o temp
list é então anexada como uma linha à matriz transposta. No caso de compreensões de lista aninhada, o loop mais externo vem no final e o loop mais interno vem no início.
Aqui está o código acima na forma de uma compreensão de lista:
matrix = [ [1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], ] transpose = [[row[n] for row in matrix] for n in range(4)] print(transpose) # [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
Outra maneira de ver isso é considerar a estrutura de compreensões de listas que substituem o básico. for
loops que você aprendeu no início do artigo.
[for in ]
Se você comparar com a compreensão da lista aninhada acima, verá que
neste caso é na verdade outra compreensão de lista: [row[n] for row in matrix]
. Esta própria compreensão de lista aninhada está na forma de um for
ciclo.
Pensamentos finais
Espero que este tutorial tenha ajudado você a entender o que são compreensões de lista e como usá-las no lugar do básico for
loops para escrever código conciso e um pouco mais rápido ao criar listas.
Outra coisa que você deve ter em mente é a legibilidade do seu código. A criação de compreensões de lista para loops aninhados provavelmente tornará o código menos legível. Nesses casos, você pode dividir a compreensão da lista em várias linhas para melhorar a legibilidade.
Além disso, não hesite em ver o que temos disponível para venda e estudo no Envato Market, e não hesite em fazer perguntas e fornecer seu valioso feedback usando o feed abaixo.
Originally posted 2022-07-11 16:23:59.