Listas

Listas são estruturas de dados capazes de armazenar múltiplos elementos.

Declaração

Para a criação de uma lista, basta colocar os elementos separados por vírgulas dentro de colchetes [], como no exemplo abaixo:

>>> nomes_frutas = ["maçã", "banana", "abacaxi"]
>>> nomes_frutas
['maçã', 'banana', 'abacaxi']

>>> numeros = [2, 13, 17, 47]
>>> numeros
[2, 13, 17, 47]

A lista pode conter elementos de tipos diferentes:

>>> ['lorem ipsum', 150, 1.3, [-1, -2]]
['lorem ipsum', 150, 1.3, [-1, -2]]

>>> vazia = []
>>> vazia
[]

Outra possibilidade de criar uma lista vazia:

>>> outra_lista_vazia = list()
>>> outra_lista_vazia
[]

Índices

Assim como nas strings, é possível acessar separadamente cada item de uma lista a partir de seu índice:

>>> lista = [100, 200, 300, 400, 500]
>>> lista[0]  # os índices sempre começam em 0
100

>>> lista[2]
300

>>> lista[4]  # último elemento
500

>>> lista[-1]  # outra maneira de acessar o último elemento
500

Conforme visto anteriormente, ao utilizar um índice negativo os elementos são acessados de trás pra frente, a partir do final da lista:

>>> lista[-2]  # penúltimo elemento
400

>>> lista[-3]  # terceiro
300

>>> lista[-4]  # segundo
200

>>> lista[-5]  # primeiro
100

Ou pode-se acessar através de slices (fatias), como nas strings:

>>> lista[2:4]  # da posição 2 até a 4 (não inclusa)
[300, 400]

>>> lista[:3]   # até a posição 3 (não incluso)
[100, 200, 300]

>>> lista[2:]   # da posição 2 até o final
[300, 400, 500]

>>> lista[:]    # do começo até o final
[100, 200, 300, 400, 500]

Tentar acessar uma posição inválida de uma lista causa um erro:

>>> lista[10]
Traceback (most recent call last):
    ...
IndexError: list index out of range

>>> lista[-10]
Traceback (most recent call last):
    ,,,
IndexError: list index out of range

Podemos avaliar se os elementos estão na lista com a palavra in:

>>> lista_estranha = ['duas palavras', 42, True, ['batman', 'robin'], -0.84, 'hipófise']
>>> 42 in lista_estranha
True

>>> 'duas palavras' in lista_estranha
True

>>> 'dominó' in lista_estranha
False

>>> 'batman' in lista_estranha[3]  # note que o elemento com índice 3 também é uma lista
True

É possível obter o tamanho da lista utilizando o método len():

>>> len(lista)
5

>>> len(lista_estranha)
6

>>> len(lista_estranha[3])
2

Removendo itens da lista

Devido à lista ser uma estrutura mutável, é possível remover seus elementos utilizando o comando del:

>>> lista_estranha
['duas palavras', 42, True, ['batman', 'robin'], -0.84, 'hipófise']

>>> del lista_estranha[2]
>>> lista_estranha
['duas palavras', 42, ['batman', 'robin'], -0.84, 'hipófise']

>>> del lista_estranha[-1]  # Remove o último elemento da lista
>>> lista_estranha
['duas palavras', 42, ['batman', 'robin'], -0.84]

Trabalhando com listas

O operador + concatena listas:

>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> c = a + b
>>> c
[1, 2, 3, 4, 5, 6]

O operador * repete a lista dado um número de vezes:

>>> [0] * 3
[0, 0, 0]

>>> [1, 2, 3] * 2
[1, 2, 3, 1, 2, 3]

O método append() adiciona um elemento ao final da lista:

>>> lista = ['a', 'b', 'c']
>>> lista
['a', 'b', 'c']

>>> lista.append('e')
>>> lista
['a', 'b', 'c', 'e']

Temos também o insert(), que insere um elemento na posição especificada e move os demais elementos para direita:

>>> lista.insert(3, 'd')
>>> lista
['a', 'b', 'c', 'd', 'e']

Aviso

Cuidado com lista.insert(-1, algo)! Nesse caso, inserimos algo na posição -1 e o elemento que estava previamente na posição -1 é movido para a direita:

>>> lista.insert(-1, 'ç')
>>> lista
['a', 'b', 'c', 'd', 'ç', 'e']

Use append() caso queira algo adicionado ao final da lista.

extend() recebe uma lista como argumento e adiciona todos seus elementos a outra:

>>> lista1 = ['a', 'b', 'c']
>>> lista2 = ['d', 'e']
>>> lista1
['a', 'b', 'c']

>>> lista2
['d', 'e']

>>> lista1.extend(lista2)
>>> lista1
['a', 'b', 'c', 'd', 'e']

lista2 não é modificado:

>>> lista2
['d', 'e']

O método sort() ordena os elementos da lista em ordem ascendente:

>>> lista_desordenada = ['b', 'z', 'k', 'a', 'h']
>>> lista_desordenada
['b', 'z', 'k', 'a', 'h']

>>> lista_desordenada.sort()
>>> lista_desordenada  # Agora está ordenada!
['a', 'b', 'h', 'k', 'z']

Para fazer uma cópia de uma lista, devemos usar o método copy():

>>> lista1 = ['a', 'b', 'c']
>>> lista2 = lista1.copy()
>>> lista1
['a', 'b', 'c']
>>> lista2
['a', 'b', 'c']
>>> lista2.append('d')
>>> lista1
['a', 'b', 'c']
>>> lista2
['a', 'b', 'c', 'd']

Se não usarmos o copy(), acontece algo bem estranho:

>>> lista1 = ['a', 'b', 'c']
>>> lista2 = lista1
>>> lista1
['a', 'b', 'c']
>>> lista2
['a', 'b', 'c']
>>> lista2.append('d')
>>> lista1
['a', 'b', 'c', 'd']
>>> lista2
['a', 'b', 'c', 'd']

Tudo o que for feito com lista2 nesse exemplo também altera lista1 e vice-versa.

Exercícios

  1. Crie uma lista com o nome das 3 pessoas mais próximas.

  2. Crie três listas, uma lista de cada coisa a seguir:

    • frutas

    • docinhos de festa (não se esqueça de brigadeiros!!)

    • ingredientes de feijoada

    Lembre-se de salvá-las em alguma variável!

    1. Agora crie uma lista que contém essas três listas.

    Nessa lista de listas (vou chamar de listona):

    1. você consegue acessar o elemento brigadeiro?

    2. Adicione mais brigadeiros à segunda lista de listona. O que aconteceu com a lista de docinhos de festa?

    3. Adicione bebidas ao final da listona, mas sem criar uma lista!

  3. Utilizando o del, remova todos os elementos da lista criada anteriormente até a lista ficar vazia.

  4. Faça uma lista de compras do mês, não se esqueça de comprar produtos de limpeza e sorvete!

    Agora «vá ao mercado» e delete apenas os produtos de limpeza da lista.

    Agora «vá à sorveteria» e se empanturre de sorvete e tire o sorvete da lista.

  5. Dado uma lista de números, faça com que os números sejam ordenados e, em seguida, inverta a ordem da lista usando slicing.

  6. Receba uma lista com números inteiros e devolva um número inteiro correspondente à soma dos números recebidos.

  7. Receba uma lista com números inteiros. Verifique se a lista possui números repetidos, caso possua, exclua-os e devolva a lista alterada.

    Dica 1: usar a função range.

    Dica 2: ordene os elementos da lista em ordem ascendente.

  8. As reuniões mais memoráveis do grupy-sanca são, sem dúvidas, os PyBares! Quando finalmente foi decretado o final da pandemia de Covid-19, pythonistas de São Carlos e região se reuniram para comemorar, e a comemoração foi tanta, que neste momento estão com dificuldades de listar quais atividades e eventos são organizados pelo grupo, sem repetirem as já listadas.

    Como programar já é a sua especialidade, você resolveu escrever um programa para sanar este pequeno problema. Seu programa deve ler um número N que determina quantos eventos e atividades foram elencados (que pode ter itens repetidos), e, em seguida, N nomes de atividades e eventos organizados pelo grupy-sanca e imprimir uma lista ordenada alfabeticamente e sem itens repetidos.

    Dica: utilize o operador in para testar se uma entrada já está na lista, e o método sort para ordená-la. Também pode ser útil utilizar o método strip no seu input para evitar que espaços em branco interfiram nas suas comparações.

  9. Uma das atividades preferidas do grupy-sanca é o Coding Dojo. Coding Dojo é uma atividade colaborativa onde pessoas se reúnem a fim de resolver desafios de programação juntas, programando em pares, e utilizando a metodologia de desenvolvimento orientada a testes (TDD). A pessoa na posição do piloto programará por 5 minutos, orientada pela pessoa na posição de copiloto, e ao final deste tempo, o piloto voltará para a plateia, o copiloto será promovido a piloto e uma pessoa da plateia tomará a posição de copiloto.

    plateia -> copiloto -> piloto -> plateia

    Você está responsável pela organização do Coding Dojo de hoje, e, para garantir que todas as pessoas participarão da atividade da forma mais justa possível, você resolveu criar um programa que imprimirá o nome de cada dupla que representará copiloto e piloto em cada rodada.

    Você pegou no Meetup uma lista com N nomes de participantes, a duração do evento é de 2 horas, e cada rodada dura 5 minutos. Caso você chegue ao final da lista e o tempo ainda não tiverem passado as 2h do Coding Dojo, você começará de novo.

    Nota

    Utilize o operador de resto da divisão (%) para iterar circularmente sobre a lista.

Função range()

Aprendemos a adicionar itens a uma lista mas, e se fosse necessário produzir uma lista com os números de 1 até 200?

>>> lista_grande = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13] # ???
>>> lista_grande
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]

Em Python existe a função embutida range(), com ela é possível produzir uma lista extensa de uma maneira bem simples:

>>> print(list(range(1, 200)))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199]

Além disso, o range() também oferece algumas coisas interessantes. Por exemplo, imprimir os números espaçados de 5 em 5, entre 0 e 30:

>>> print(list(range(0, 30, 5)))
[0, 5, 10, 15, 20, 25]

Mas, como na maior parte das vezes apenas queremos uma lista começando em 0 e indo até o número desejado, a função range() também funciona da seguinte maneira:

>>> print(list(range(10)))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Nota

O intervalo do range() é aberto, ou seja, quando passamos o valor 10, ele vai até o 9 (n - 1). Caso deseje criar a lista até o 10 de fato, deve-se passar o valor 11.

Mas por que precisamos transformar o range() em list? O que acontece se não fizermos isso?

>>> print(range(200))
range(0, 200)

Mas o que é que essa função retorna?

>>> type(range(200))
<class 'range'>"

AHA! A função range() retorna algo do tipo range, por isso precisamos transformar em uma lista para vermos todos os números no print()!