Compreensões Python: Introdução Passo a Passo - Guia Rápido Python

List Comprehensions são um tipo especial de sintaxe que nos permite criar listas a partir de outras listas (Wikipedia, The Python Tutorial). Elas são incrivelmente úteis ao lidar com números e com um ou dois níveis de for loops aninhados, mas além disso, podem se tornar um pouco difíceis de ler.
Neste artigo, vamos criar alguns For Loops e reescrevê-los, passo a passo, em Comprehensions.
Básico
A verdade é que List Comprehensions não são muito complexas, mas ainda são um pouco difíceis de entender no início porque parecem um pouco estranhas. Por quê? Bem, a ordem em que são escritas é o oposto do que geralmente vemos em um For Loop.
>>> names = ['Charles', 'Susan', 'Patrick', 'George', 'Carol']
>>> for n in names:
... print(n)
# Charles
# Susan
# Patrick
# George
# Carol
Para fazer o mesmo com uma List Comprehension, começamos bem no final do loop:
>>> names = ['Charles', 'Susan', 'Patrick', 'George', 'Carol']
>>> [print(n) for n in names]
# Charles
# Susan
# Patrick
# George
# Carol
Note como invertemos a ordem:
- Primeiro, temos o que será a saída do loop
[print(n) ...]. - Depois, definimos a variável que armazenará cada um dos itens e apontamos para a
List,SetouDictionarycom a qual trabalharemos[... for n in names].
Criando uma nova Lista com uma Comprehension
Este é o uso principal de uma List Comprehension. Outros usos podem resultar em um código difícil de ler para você e para os outros.
É assim que criamos uma nova lista a partir de uma coleção existente com um For Loop:
>>> names = ['Charles', 'Susan', 'Patrick', 'George', 'Carol']
>>> new_list = []
>>> for n in names:
... new_list.append(n)
>>> print(new_list)
# ['Charles', 'Susan', 'Patrick', 'George', 'Carol']
E é assim que fazemos o mesmo com uma List Comprehension:
>>> names = ['Charles', 'Susan', 'Patrick', 'George', 'Carol']
>>> new_list = [n for n in names]
>>> print(new_list)
# ['Charles', 'Susan', 'Patrick', 'George', 'Carol']
A razão pela qual podemos fazer isso é que o comportamento padrão de uma List Comprehension é retornar uma lista:
>>> names = ['Charles', 'Susan', 'Patrick', 'George', 'Carol']
>>> [n for n in names]
# ['Charles', 'Susan', 'Patrick', 'George', 'Carol']
Adicionando Condicionais
E se quisermos que new_list contenha apenas os nomes que começam com C? Com um For Loop, faríamos assim:
>>> names = ['Charles', 'Susan', 'Patrick', 'George', 'Carol']
>>> new_list = []
>>> for n in names:
... if n.startswith('C'):
... new_list.append(n)
>>> print(new_list)
# ['Charles', 'Carol']
Em uma List Comprehension, adicionamos a instrução if no final:
>>> names = ['Charles', 'Susan', 'Patrick', 'George', 'Carol']
>>> new_list = [n for n in names if n.startswith('C')]
>>> print(new_list)
# ['Charles', 'Carol']
Muito mais legível.
Formatando List Comprehensions longas
Desta vez, queremos que new_list contenha não apenas os nomes que começam com C, mas também aqueles que terminam com e e contêm um k:
>>> names = ['Charles', 'Susan', 'Patrick', 'George', 'Carol']
>>> new_list = [n for n in names if n.startswith('C') or n.endswith('e') or 'k' in n]
>>> print(new_list)
# ['Charles', 'Patrick', 'George', 'Carol']
Isso está bem confuso. Felizmente, é possível dividir Comprehensions em linhas diferentes:
new_list = [
n
for n in names
if n.startswith("C")
or n.endswith("e")
or "k" in n
]
Set e Dict Comprehensions
Se você aprendeu o básico de List Comprehensions… Parabéns! Você acabou de fazer isso com Sets e Dictionaries.
Set comprehension
>>> my_set = {"abc", "def"}
>>> # Aqui, criamos um novo set com elementos em maiúsculas com um for loop
>>> new_set = set()
>>> for s in my_set:
... new_set.add(s.upper())
>>> print(new_set)
# {'DEF', 'ABC'}
>>> # O mesmo, mas com uma set comprehension
>>> new_set = {s.upper() for s in my_set}
>>> print(new_set)
# {'DEF', 'ABC'}
Dict comprehension
>>> my_dict = {'name': 'Christine', 'age': 98}
>>> # Um novo dicionário a partir de um existente com um for loop
>>> new_dict = {}
>>> for key, value in my_dict.items():
... new_dict[key] = value
>>> print(new_dict)
# {'name': 'Christine', 'age': 98}
# Usando uma dict comprehension
>>> new_dict = {key: value for key, value in my_dict.items()} # Note o ":"
>>> print(new_dict)
# {'name': 'Christine', 'age': 98}
Artigo Recomendado: Python Sets: O Que, Por Que e Como .
Conclusão
Toda vez que aprendo algo novo, surge essa vontade de usá-lo imediatamente. Quando isso acontece, eu me forço a parar e pensar por um momento… Devo mudar este For Loop grande, aninhado e com aparência já confusa para uma List Comprehension? Provavelmente não.
Legibilidade conta. The Zen of Python.