Listas

O Python possui algumas diferentes estruturas de dados utilizados para armazenar diferentes tipos de dados. Cada uma delas tem suas particularidades. Neste capítulo, veremos um pouco sobre as listas.

Se você está vindo de outra linguagem de programação, é possível que já tenha trabalhado com arrays. As listas do Python são os arrays das outras linguagens.

Se não veio, vou explicar. As listas são estruturas de dados sequenciais do Python que servem para armazenar diferentes tipos de dados. As listas podem armazenar qualquer tipo de dado, como números inteiros, strings, números decimais e até outras listas.

Criando, modificando e acessando itens em uma lista

Para criar uma lista, basta definir seus itens entre colchetes [] e separados por vírgula. Também é possível criar uma lista vazia, definindo apenas os colchetes, sem nenhum item dentro deles. Vejamos alguns exemplos:

alunos = ["José", "João", "Luiz"]
notas = [8.5, 9.2, 6.7]
print(alunos)
print(notas)
lista_vazia = []
print(lista_vazia)

> ['José', 'João', 'Luiz']
> [8.5, 9.2, 6.7]
> []

Note que os itens não precisam ser todos do mesmo tipo. Você pode misturar itens de diferentes tipos dentro de uma mesma lista.

lista_misturada = [12, 15.56, "Sorveteria", ["Baunilha", "Chocolate"]]
print(lista_misturada)

> [12, 15.56, 'Sorveteria', ['Baunilha', 'Chocolate']]

A lista acima, como você viu, possui um inteiro, um decimal, uma string e uma outra lista.

Para acessar os itens de uma lista, você utiliza o índice de cada uma delas, ou seja, a posição que o item desejado ocupa na lista. O primeiro item é o de índice 0 (zero). Vejamos:

print(alunos[0])
print(notas[2])

> José
> 6.7

Você também pode usar índices negativos, e assim a contagem será feita do final da lista:

print(alunos[-1])
print(alunos[-3])

> Luiz
> José

Da mesma forma, também podemos alterar o valor que está nestes índices.

print(notas)
notas[2] = 7.7
print(notas)

> [8.5, 9.2, 6.7]
> [8.5, 9.2, 7.7]

E quando queremos adicionar novos itens a uma lista? Bem, nesse caso temos três funções. A primeira delas é a função append(). Chamada através de uma lista, recebe como parâmetro o item a ser adicionado ao final da lista:

print(alunos)
alunos.append('Alfredo')
print(alunos)

> ['José', 'João', 'Luiz']
> ['José', 'João', 'Luiz', 'Alfredo']

E se não quisermos que o novo item fique no final? Bem, aí usamos a função insert(). Nesta função, indicamos o índice que o novo item deverá ficar. Os outros itens são ajustados de acordo:

print(alunos)
alunos.insert(1, "Daniela")
print(alunos)

> ['José', 'João', 'Luiz', 'Alfredo']
> ['José', 'Daniela', 'João', 'Luiz', 'Alfredo']

Repare como Daniela se tornou o item no índice 1, conforme indicamos como parâmetro na função insert().

Por fim, temos a função extend(). Esta função adiciona uma lista de itens ao final de outra lista:

print(alunos)
novos_alunos = ['Carlos', 'Maria', 'Ana']
alunos.extend(novos_alunos)
print(alunos)

> ['José', 'Daniela', 'João', 'Luiz', 'Alfredo']
> ['José', 'Daniela', 'João', 'Luiz', 'Alfredo', 'Carlos', 'Maria', 'Ana']

Também é possível concatenar duas listas, utilizando apenas o sinal de +:

alunos1 = ['José', 'Daniel', 'João']
alunos2 = ['Carlos', 'Augusto', 'Denis']
print(alunos1 + alunos2)

> ['José', 'Daniel', 'João', 'Maria', 'Ana', 'Carolina']

E por fim, também é possível usar o sinal de multiplicação para repetir itens de uma lista:

print(notas*2)

> [8.5, 9.2, 7.7, 8.5, 9.2, 7.7]

Bem, e para remover? Para remover itens de uma lista, temos as funções remove() e pop(). A função remove(), apaga o item com base em seu valor:

print(alunos)
alunos.remove('João')
print(alunos)

> ['José', 'Daniela', 'João', 'Luiz', 'Alfredo', 'Carlos', 'Maria', 'Ana']
> ['José', 'Daniela', 'Luiz', 'Alfredo', 'Carlos', 'Maria', 'Ana']

A função pop(), remove um item da lista com base no seu índice. Caso nenhum argumento seja passado, ele remove o último item. A função também retorna o item removido:

print(alunos)
aluno_removido = alunos.pop()
print(aluno_removido)
print(alunos)
aluno_removido = alunos.pop(2)
print(aluno_removido)
print(alunos)

> ['José', 'Daniela', 'Luiz', 'Alfredo', 'Carlos', 'Maria', 'Ana']
> Ana
> ['José', 'Daniela', 'Luiz', 'Alfredo', 'Carlos', 'Maria']
> Luiz
> ['José', 'Daniela', 'Alfredo', 'Carlos', 'Maria']

E se temos dois itens com o mesmo valor e usamos a função remove()? Neste caso, a função remove apenas a primeira ocorrência deste valor:

alunos = ['José', 'Denis', 'Daniela', 'Carla', 'Carlos', 'Augusto', 'Denis']
print(alunos)
alunos.remove('Denis')
print(alunos)

> ['José', 'Denis', 'Daniela', 'Carla', 'Carlos', 'Augusto', 'Denis']
> ['José', 'Daniela', 'Carla', 'Carlos', 'Augusto', 'Denis']

Repare no exemplo acima que a lista possuía o nome Denis duas vezes, mas apenas a primeira ocorrência, que era o segundo item da lista, foi removido.

As listas também têm uma funcionalidade interessante, que é a de extrair partes da lista, o que em inglês é chamado de slicing. Para fazer isso, usamos uma notação semelhante à de acessar itens dentro das listas, mas informamos o intervalo que desejamos acessar. Vejamos o exemplo para que fique mais claro:

print(alunos)
print(alunos[0:2])
print(alunos[2:4])
print(alunos[2:5])

> ['José', 'Daniela', 'Carla', 'Carlos', 'Augusto', 'Denis']
> ['José', 'Daniela']
> ['Carla', 'Carlos']
> ['Carla', 'Carlos', 'Augusto']

Com esta notação, o Python pega os itens no intervalo definido dentro dos colchetes, iniciando o intervalo no primeiro número e terminando no segundo, mas sem incluir o segundo.

Se omitimos um dos números, ele parte do princípio da lista ou vai até o final dela.

print(alunos[:3])
print(alunos[3:])

> ['José', 'Daniela', 'Carla']
> ['Carlos', 'Augusto', 'Denis']

Também é possível utilizar números negativos. Desta forma, a contagem é feita a partir do final:

print(alunos[1:-1])
print(alunos[2:-2])

['Daniela', 'Carla', 'Carlos', 'Augusto']
['Carla', 'Carlos']

Funções úteis para trabalhar com listas

Entre as funções interessantes que podemos utilizar com as listas estão:

len()

A função len(), assim como ocorre quando utilizada com strings, retorna a quantidade de itens em uma lista:

print(len(alunos))

> 6

max() e min()

As funções max() e min(), como os nomes já devem indicar, retornam o valor máximo e o mínimo em uma lista:

print(max(notas))
print(min(notas))

> 9.2
> 7.7

copy()

A função copy() é a forma correta de criar uma cópia de uma lista. Definir uma nova lista igual a uma lista prévia (utilizando o sinal de =), apesar de parecer intuitivo, não funciona, pois isto cria apenas uma referência à lista original. Vejamos primeiramente qual o problema com isso:

alunos = ["José", "João", "Luiz", "Carlos", "Afonso"]
alunos_backup = alunos
print(alunos_backup)
alunos.clear()
print(alunos)
print(alunos_backup)

> ['José', 'João', 'Luiz', 'Carlos', 'Afonso']
> []
> []

Repare como a lista alunos_backup possuía os itens iguais à lista aluno, mas ficou vazia após usarmos a função clear() para remover todos os itens da lista alunos. O que aconteceu é que, ao fazermos alunos_backup = alunos, apenas criamos uma referência à lista original, sem copiá-la. Quando esvaziamos a lista original, como a nova lista alunos_backup era uma referência à original, ela também ficou vazia.

Vejamos agora a forma correta de criar uma cópia, usando a função copy() (vamos aproveitar e recriar a lista alunos, que ficou vazia após o último exemplo):

alunos = ['José', 'Daniela', 'Carla', 'Carlos', 'Augusto', 'Denis']
alunos_backup = alunos.copy()
print(alunos_backup)                                  
alunos.clear()                                        
print(alunos_backup)

> ['José', 'Daniela', 'Carla', 'Carlos', 'Augusto', 'Denis']
> ['José', 'Daniela', 'Carla', 'Carlos', 'Augusto', 'Denis']

Agora, mesmo limpando a primeira lista, a lista de backup permanece inalterada. Vamos apenas recriar a lista alunos novamente agora, para o caso de a usarmos em exemplos próximos.

alunos = ['José', 'Daniela', 'Carla', 'Carlos', 'Augusto', 'Denis']

count()

A função count() retorna a quantidade de vezes que um determinado item ocorre em uma lista. Basta passar este item que se deseja contar como parâmetro da função. Vamos adicionar alguns nomes repetidos na lista alunos com a função extend() e checar o funcionamento da função count():

alunos.extend(['Daniela', 'Felipe', 'Carla', 'Daniela'])
print(alunos.count('Daniela'))

> 3

sort() e sorted()

A função sort() ordena uma lista. Mas ela tem uma particularidade, e você deve tomar cuidado. Ela não retorna nenhum valor, mas sim ordena a lista permanentemente:

alunos.sort()
print(alunos)

> ['Augusto', 'Carla', 'Carla', 'Carlos', 'Daniela', 'Daniela', 'Daniela', 'Denis', 'Felipe', 'José']

Caso você precise manter os dados na ordem que estavam e deseje apenas fazer uma exibição da lista ordenada, você tem duas opções. Ou fazer uma cópia da lista, usando a função copy() que vimos logo acima, ou podemos usar a função sorted(). Esta função recebe uma lista como parâmetro e retorna a lista ordenada. Neste caso, se você quer manter esta versão ordenada da lista, deve salvá-la em uma nova variável:

alunos = ['José', 'Daniela', 'Carla', 'Carlos', 'Augusto', 'Denis']
alunos_ordenada = sorted(alunos)
print(alunos_ordenada)
print(alunos)

> ['Augusto', 'Carla', 'Carlos', 'Daniela', 'Denis', 'José']
> ['José', 'Daniela', 'Carla', 'Carlos', 'Augusto', 'Denis']

reverse()

A função reverse() reverte a ordem dos elementos de uma lista. Assim como a função sort(), ela executa a operação permanentemente na lista onde é chamada, e por isso, deve-se tomar cuidado ao utilizá-la:

alunos.reverse()
print(alunos)

> ['José', 'Denis', 'Daniela', 'Daniela', 'Daniela', 'Carlos', 'Carla', 'Carla', 'Augusto']

in

Apesar de não ser uma função, in é uma keyword do Python muito comumente utilizada com listas. Ela serve para verificar se um determinado item consta ou não na lista:

print("José" in alunos)
print("Felipe" in alunos)

> True
> False

split() e join()

Estas são funções com propósitos opostos, e elas na verdade operam em strings. Mas como se tratam de funções que se relacionam com listas (ou outros tipos de sequências), preferi aguardar o capítulo de listas para falar sobre elas.

A função split() retorna uma lista a partir de uma string e de um separador definido, que pode ser qualquer coisa, mas por padrão é um espaço.

Já a função join() retorna uma string a partir de uma sequência, com os itens da sequência divididos por um determinado separador.

alunos_string = "; ".join(alunos)
print(alunos_string)
alunos_lista = alunos_string.split("; ")
print(alunos_lista)

> José; Denis; Daniela; Daniela; Daniela; Carlos; Carla; Carla; Augusto
> ['José', 'Denis', 'Daniela', 'Daniela', 'Daniela', 'Carlos', 'Carla', 'Carla', 'Augusto']

Conclusão

E assim concluímos o capítulo sobre listas. Vimos que as listas são estruturas para armazenar dados de diferentes tipos. Vimos também como criar, acessar dados e modificar uma lista. E por fim, vimos algumas funções bastante úteis para serem usados com as listas. No próximo capítulo veremos uma estrutura semelhante, a tupla.