Listas em Python – Parte 2

Olá! No artigo anterior foram apresentadas diversas formas de como manipular listas em Python e também como realizar as operações mais básicas com incluir, alterar, excluir e pesquisar elementos. Uma vez que o entendimento básico de listas foi compreendido, prosseguiremos no conteúdo abordando algumas operações e comandos mais avançados. Como por exemplo imprimir todos os elementos de uma lista e também como utilizar o método slice para criar sublistas. Esses comandos são muito utilizadas em bibliotecas de manipulação de dados na área de Inteligência Artificial. Assim como, funções built-in que facilitam a programação e uma forma mais eficiente de percorrer as listas. E para concluir uma estrutura muito similar e também muito utilizada no desenvolvimento de algoritmos, as tuplas! Show! Vamos lá 🙂

Imprimindo os valores de uma lista

Uma vez que a lista foi criada, é preciso encontrar uma forma de acessar os elementos dessa lista. Esse acesso pode ser realizado através do índice que é repassado como parâmetro ou ainda é possível digitar o nome da lista e imprimir todo o conteúdo de uma única vez. Entretanto, o que acontece quando é preciso realizar alguma operação quando um elemento satisfaça uma determinada condição? No exemplo a seguir essa situação é abordada.

meses = ['janeiro', 'fevereiro','março','abril','maio','junho']
for mes in meses:
    if mes == 'abril':
        print(mes+' é o mês do seu aniversário!')
        continue
    print(mes) 
janeiro
fevereiro
março
abril é o mês do seu aniversário!
maio
junho

No exemplo acima a lista meses é inicializada na primeira linha com os meses de janeiro até junho. Em seguida a impressão da lista é realizada através do comando for de forma iterativa na linha 2. Ou seja, todos os elementos da lista são percorridos um a um e seguida na linha 3 foi adicionada uma condição com o comando if. Essa condição verifica se o valor que esta contido no momento da impressão é igual a abril, caso verdadeira a mensagem “abril é o mês do seu aniversario!” é impressa. Na linha abaixo é utilizado o comando continue que faz com seja interrompida a execução do ciclo sem interromper a execução do laço de repetição for. Na prática o mês de abril não será impresso duas vezes e é realizada a impressão até que não restem mais elementos na lista. Outro ponto a se considerar nesse exemplo, na primeira linha o sinal de = é de atribuição e na terceira linha o sinal == representa uma comparação.

Fatiando os valores de uma lista

As listas são estruturas de dados que podem ser acessadas através de um índice na estrutura list[index]. Entretanto, essa forma de trabalho é útil quando se deseja imprimir um único elemento. E se fosse necessário imprimir vários elementos de uma única vez, criando assim, uma sublista? O método de lista slice permite realizar o fatiamento de uma lista em listas menores, ou também chamadas de sublistas. Ou seja, ao invés de utilizar list[index] que acessava um único elemento, é possível acessar vários ao mesmo tempo com o comando list[index1:index2]. Basicamente falando list[start:stop] como mostra o exemplo abaixo.

meses = ['janeiro', 'fevereiro','março','abril','maio','junho','julho']
print(meses[2:4])  
['março', 'abril']

No exemplo acima, a lista meses foi inicializada com os valores correspondentes aos meses de janeiro até junho na primeira linha. Em seguida é realizada a impressão da lista meses iniciando pelo índice 2 e terminando no índice 4, como mostram as linhas 3 e 4. Entretanto, o parâmetro stop sempre realizará a operação stop -1. Considere o fato de que os índices em uma lista iniciam na posição zero e que o valor correspondente ao índice 4 é maio, mas devido ao parâmetro o mês impresso é abril. Ainda nesse método é possível especificar o valor do incremento entre os índices a serem fatiados. Abaixo foi criada a variável numeros contendo uma sequência numérica que mostra o uso do parâmetro step.

numeros = [21 ,22 ,23 ,24 ,25 ,26 ,27 ,28 ,29 ,30 ,31 ,32]
print(numeros[1:9:2])
[22, 24, 26, 28]

Observe que no exemplo acima na linha 2, a impressão é iniciada no índice 1 até o índice 9. Porém, dessa vez foi especificado que o incremento dessa operação é 2, ou seja a impressão da lista começa no índice 1 que tem o valor 22, pula o índice 2 em seguida faz a impressão do índice 3 com o valor 24, subsequentemente até chegar no índice [9] -1 com o valor 28.

Por meio dos índices também é possível passar valores negativos, nesse caso apenas invertem-se os valores sendo o último elemento com o índice zero e decrescendo negativamente até o primeiro item da lista. Na imagem abaixo no primeiro retângulo, é possível observar como ocorre essa inversão que para efeitos de impressão são os mesmos, porém de modo inverso. O segundo retângulo exemplifica o que acontece quando o método slice é utilizado.

meses = ['janeiro', 'fevereiro','março','abril','maio','junho']
print(meses[-4:-2])
['março', 'abril']

No exemplo acima, foi realizada a impressão da lista utilizando os índices negativos, perceba que o primeiro mês a ser impresso foi março, pois ele é o último no intervalo [-4:-2] e o segundo foi abril com o índice -2.

Alguns comando podem ser tornar bem úteis no dia a dia como mostra o exemplo abaixo.

meses = ['janeiro', 'fevereiro','março','abril','maio','junho','julho']
print(meses[2:4]) #começa em 2 e para 4-1
['março', 'abril']
print(meses[2:])  #começa em 2 e imprime o restante da lista
['março', 'abril', 'maio', 'junho', 'julho']
print(meses[:4])  #imprime todos os valores anteriores a 4-1
['janeiro', 'fevereiro', 'março', 'abril']
print(meses[:])   #uma cópia da lista
['janeiro', 'fevereiro', 'março', 'abril', 'maio', 'junho', 'julho']
print(meses[::-1])#uma cópia invertida da lista
['julho', 'junho', 'maio', 'abril', 'março', 'fevereiro', 'janeiro']
print(meses[-1])  #último elemento da lista
julho
print(meses[-2:]) #dois últimos elementos da lista
['junho', 'julho']
print(meses[:-2]) #imprime tudo, exceto os dois últimos valores da lista
['janeiro', 'fevereiro', 'março', 'abril', 'maio']
print(meses[::2]) #imprimindo com step=2
['janeiro', 'março', 'maio', 'julho']

Compreensão de listas em Python – List Comprehensions

A compreensão de lista é utilizada para criar novas listas a partir de outros iteráveis. A estrutura do comando consiste em nova_lista = [expressão for_loop_um_ou_mais condição]. Veja no exemplo abaixo, como seria para retonar a potência de uma sequencia de números.

numeros = [1,2,3,4]
for numero in numeros:
        print(numero**2)
1
4
9
16

Com a compreensão de lista é possível reduzir a expressão em um única linha, como mostra abaixo. Na primeira linha a lista é inicializada e seguida na linha 2 é passada a expressão que realizará o cálculo da potência seguido com comando for responsável por iterar os elementos da lista.

numeros = [1,2,3,4]
[numero**2 for numero in numeros]
[1, 4, 9, 16]

No exemplo do início do artigo foi realizada a impressão de todos os elementos da lista. Nesse caso, também é possível utilizar a compreensão de lista para reduzir a expressão.

meses = ['janeiro', 'fevereiro','março','abril','maio','junho']
semestre = [print(mes+' é o mês do seu aniversário!') if mes == 'abril' else print(mes) for mes in meses] 
janeiro
fevereiro
março
abril é o mês do seu aniversário!
maio
junho

No exemplo acima na linha 2, foi criada a variável semestre que vai receber o retorno da compreensão de lista. Inicialmente é definida a expressão que será impressa caso a condição da clausula if seja verdadeira, senão é realizada a impressão dos demais elementos da lista através do loop com o comando for .

Tuplas

As tuplas são como as listas, ou seja, podem conter uma sequencia de elementos. Entretanto, uma vez que os valores são adicionados não podem ser alterados. Isso ocorre porque ao contrário das listas as tuplas são imutáveis. Na prática, isso significa que após criar uma tupla não possível adicionar, excluir ou alterar os itens. As tuplas podem ser criadas usando () ou nome de um ou mais elementos seguido de uma vírgula. Na primeira linha criada e inicializada a tupla numeros com uma sequência de três números. Na linha 2, é criada uma nova tupla sendo inicializada com duas strings separadas por uma vírgula, como mostra o exemplo abaixo:

numeros = (1,2,3)
nome = 'Fabio','Jones'
print(numeros)
print(nome)
(1, 2, 3)
('Fabio', 'Jones')

Como já foi destacado as principais diferenças em relação as listas, é que as tuplas não suportam operações do tipo append() ou insert(). Entretanto, elas ocupam menos espaço e podem ser utilizadas como chaves em dicionários, assim como os argumentos das funções são passados como tuplas.

Conclusão

Nesse artigo apresentamos alguns recursos que o Python disponibiliza dentre tantos outros. Conforme foi observado é possível realizar tarefas com um pouco mais de código. Assim como, pode-se reduzir a complexidade e facilitar a legibilidade do código, um dos princípios da linguagem. Outro ponto a se considerar é que o Python possui uma ampla comunidade que trabalha duro todos os dias para criar e manter tudo isso, então compartilhe ideias e crie experiências!

Leia também Listas em Python – Parte 1.


Fontes Pesquisadas

[1] Python Fluente: Programação Clara, Concisa e Eficaz – Luciano Ramalho [2] Python Para Análise de Dados: Tratamento de Dados com Pandas, NumPy e IPython – Wes McKinney, Lúcia A. Kinoshita [3] Python: Guia prático do básico ao avançado (Cientista de dados Livro 2) – F. V. C. Santos, Rafael. [4] https://stackoverflow.com/questions/509211/understanding-slice-notation [5] https://docs.python.org/3/tutorial/datastructures.html?highlight=list%20comprehensions#more-on-lists