|
| 1 | +Title: Abrangência de Listas e Dicionários |
| 2 | +Slug: abrangencia-de-listas-e-dicionarios-com-python |
| 3 | +Date: 2017-01-16 10:37:39 |
| 4 | +Category: Python |
| 5 | +Tags: python,tutorial,list comprehensions |
| 6 | +Author: Michell Stuttgart |
| 7 | +Email: michellstut@gmail.com |
| 8 | +Github: mstuttgart |
| 9 | +Linkedin: michellstut |
| 10 | +Facebook: michell.stuttgart |
| 11 | +Site: http://codigoavulso.com.br |
| 12 | + |
| 13 | +A utilização de listas em Python é algo trivial. A facilidade provida pela linguagem aliada a simplicidade da estrutura de dados *list* a torna, ao lado dos dicionários *dict*, uma das estrutura de dados mais utilizadas em Python. Aqui neste tutorial irei compartilhar algo que aprendi trabalhando com listas e dicionário em Python, mais especificamente no que diz respeito a *abrangência* de listas (e dicionários). |
| 14 | + |
| 15 | +### Abrangência de listas |
| 16 | + |
| 17 | +A abrangência de listas, ou do inglês *list comprehensions*, é um termo utilizado para descrever uma sintaxe compacta que o Python nos oferece para criamos uma lista baseada em outra lista. Pareceu confuso? Ok, vamos aos exemplos! |
| 18 | + |
| 19 | +#### Exemplo 1 |
| 20 | +Vamos suport que temos a seguinte lista de valores: |
| 21 | + |
| 22 | +```python |
| 23 | +valores = [1, 2, 3, 4, 5] |
| 24 | +``` |
| 25 | +Queremos gerar uma outra lista contendo o dobro de cada um desses números, ou seja, |
| 26 | + |
| 27 | +```python |
| 28 | +[2, 4, 6, 8, 10] |
| 29 | +``` |
| 30 | +Inicialmente, podemos montar o seguinte código como solução: |
| 31 | + |
| 32 | +```python |
| 33 | +# Recebe o nosso resultado |
| 34 | +valores_dobro = [] |
| 35 | + |
| 36 | +for val in valores: |
| 37 | + valores_dobro.append(val * 2) |
| 38 | + |
| 39 | +print(valores_dobro) |
| 40 | + |
| 41 | +>>> |
| 42 | +[2, 4, 6, 8, 10] |
| 43 | + |
| 44 | +``` |
| 45 | + |
| 46 | +A solução acima é uma solução simples e resolve nosso problema, entretanto para algo tão simples precisamos de 4 linhas de código. Este exemplo é uma situação onde a *abrangência de lista* pode ser útil. Podemos compactar a criação da lista `valores_dobro` da seguinte maneira: |
| 47 | + |
| 48 | +```python |
| 49 | +valores_dobro = [valor*2 for valor in valores] |
| 50 | +``` |
| 51 | +Bacana não? O exemplo seguinte podemos incrementar mais o exemplo acima. |
| 52 | + |
| 53 | +#### Exemplo 2 |
| 54 | + |
| 55 | +Vamos supor que desejamos criar uma lista onde apenas os valores pares (resto da divisão por 2 é zero) serão multiplicados por 2. Abaixo temos a nossa lista de valores: |
| 56 | + |
| 57 | +```python |
| 58 | +valores = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] |
| 59 | +``` |
| 60 | + |
| 61 | +Assim como no exemplo anterior, podemos resolver utilizando um algoritmo básico. |
| 62 | + |
| 63 | +```python |
| 64 | +# Lista que recebera o nosso resultado |
| 65 | +valores_dobro = [] |
| 66 | + |
| 67 | +for valor in valores: |
| 68 | + if valor % 2 == 0: |
| 69 | + valores_dobro.append(valor * 2) |
| 70 | + |
| 71 | +print(valores_dobro) |
| 72 | + |
| 73 | +>>> |
| 74 | +[4, 8, 12, 16, 20] |
| 75 | + |
| 76 | +``` |
| 77 | +Podemos também resolver o mesmo problema utilizando as funções nativas *map* e *filter*: |
| 78 | + |
| 79 | +```python |
| 80 | +valores_dobro = map(lambda valor: valor * 2, filter(lambda valor: valor % 2 == 0, valores)) |
| 81 | +``` |
| 82 | +Muito mais complicada não é? Apesar de resolver nosso problema, expressões como a acima são difíceis de ler e até mesmo de escrever. Em casos como esse, podemos novamente compactar nosso algoritmo utilizando a *abrangência de lista*. |
| 83 | + |
| 84 | +```python |
| 85 | +valores_dobro = [valor * 2 for valor in valores if valor % 2 == 0] |
| 86 | +``` |
| 87 | +Muito mais simples, não? Vamos para o próximo exemplo. |
| 88 | + |
| 89 | +#### Exemplo 3 |
| 90 | + |
| 91 | +De maneira semelhante a lista, nós também podemos aplicar a abrangência em lista e dicionários. Segue um exemplo onde temos o seguinte dicionário: |
| 92 | + |
| 93 | +```python |
| 94 | + dicionario = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6} |
| 95 | +``` |
| 96 | + |
| 97 | +Vamos criar um segundo dicionário contendo apenas as chaves que são consoantes, ou seja, `b`, `c`, `d` e `f`, sendo que o valor para cada uma dessas chaves deve ser o dobro do valor armazenado na respectiva chave do dicionário original. Complicado? Em outras palavras, o novo dicionário deve ficar assim: |
| 98 | + |
| 99 | +```python |
| 100 | + novo_dicionario = {'b': 4, 'c': 6, 'd': 8, 'f': 12} |
| 101 | +``` |
| 102 | + |
| 103 | +Utilizando um algoritmo genérico, podemos reslo o problema da seguinte maneira: |
| 104 | + |
| 105 | +```python |
| 106 | +novo_dicionario = {} |
| 107 | + |
| 108 | +for chave, valor in dicionario: |
| 109 | + if chave in ['b', 'c', 'd', 'f']: |
| 110 | + novo_dicionario[chave] = 2 * valor |
| 111 | + |
| 112 | +print(novo_dicionario) |
| 113 | + |
| 114 | +>> |
| 115 | +{'b': 4, 'c': 6, 'd': 8, 'f': 12} |
| 116 | + |
| 117 | +``` |
| 118 | +Aplicando agora a abrangência, conseguimos compactar o código acima de maneira interessante: |
| 119 | + |
| 120 | +```python |
| 121 | +novo_dicionario = {chave: 2 * valor for chave, valor in dicionario.items() if chave in ['b', 'c', 'd', 'f']} |
| 122 | +``` |
| 123 | + |
| 124 | +### Conclusão |
| 125 | + |
| 126 | +Chegamos ao final de mais um tutorial! Sempre temos de ter em mente que tão importante quanto escrever um código que funciona, é mantê-lo (seja por você ou por outro programador). Neste ponto, a abrangência de lista (e outras estruturas de dados) nos ajudam a escrever um código claro e fácil de dar manutenção. |
| 127 | + |
| 128 | +Até o próximo tutorial pessoal! |
| 129 | + |
| 130 | +**Publicado originalmente:** [Abrangencia de listas e dicionários com Python](http://codigoavulso.com.br/abrangencia-de-listas-e-dicionarios.html) |
| 131 | + |
| 132 | +### Referências |
| 133 | + |
| 134 | +* [Python eficaz: 59 maneiras de programar melhor em Python; Slatkin, Brett; Novatec Editora, 2016.](https://novatec.com.br/livros/python-eficaz/) |
0 commit comments