Posted on March 22, 2019· Updated on July 3, 2022

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

#python #basics
Image for 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, Set ou Dictionary com 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.