Neste capítulo e no próximo, você aprenderá o que são listas e como começar a trabalhar com os elementos em uma lista. As listas permitem que você armazene conjuntos de informações em um só lugar, quer você tenha apenas alguns itens ou milhões de itens. As listas são um dos recursos mais poderosos do Python prontamente acessíveis a novos programadores, e elas unem muitos conceitos importantes na programação.
Uma lista é uma coleção de itens em uma ordem específica. Você pode fazer uma lista que inclua as letras do alfabeto, os dígitos de 0 a 9 ou os nomes de todas as pessoas da sua família. Você pode colocar o que quiser em uma lista, e os itens na sua lista não precisam estar relacionados de nenhuma maneira específica. Como uma lista geralmente contém mais de um elemento, é uma boa ideia tornar o nome da sua lista plural.
Em Python, colchetes ([]) indicam uma lista, e elementos individuais na lista são separados por vírgulas. Aqui está um exemplo simples de uma lista que contém alguns tipos de bicicletas:
bicicletas = ['elétrica', 'passeio', 'mountain bike', 'corrida']
print(bicicletas)
Se você pedir ao Python para imprimir uma lista, o Python retornará sua representação da lista, incluindo os colchetes.
Como esta não é a saída que você deseja que seus usuários vejam, vamos aprender como acessar os itens individuais em uma lista.
Listas são coleções ordenadas, então você pode acessar qualquer elemento em uma lista informando ao Python a posição, ou índice, do item desejado. Para acessar um elemento em uma lista, escreva o nome da lista seguido pelo índice do item entre colchetes.
Por exemplo, vamos retirar a primeira bicicleta da lista bicicletas:
print(bicicletas[0])
Quando solicitamos um único item de uma lista, o Python retorna apenas esse elemento sem colchetes.
Este é o resultado que você quer que seus usuários vejam: uma saída limpa e bem formatada.
Você também pode usar os métodos de string do Capítulo 2 em qualquer elemento desta lista. Por exemplo, você pode formatar o elemento 'elétrica' para parecer mais apresentável usando o método title():
print(bicicletas[0].title())
Este exemplo produz a mesma saída do exemplo anterior, exceto que 'Elétrica' é escrito em maiúscula.
O Python considera o primeiro item em uma lista como estando na posição 0, não na posição 1. Isso é verdade para a maioria das linguagens de programação, e o motivo tem a ver com a forma como as operações de lista são implementadas em um nível mais baixo. Se você estiver recebendo resultados inesperados, pergunte a si mesmo se está cometendo um erro offby-one simples, mas comum.
O segundo item em uma lista tem um índice de 1. Usando esse sistema de contagem, você pode obter qualquer elemento que quiser de uma lista subtraindo um de sua posição na lista. Por exemplo, para acessar o quarto item em uma lista, você solicita o item no índice 3:
print(bicicletas[1])
print(bicicletas[3])
Este código retorna a segunda e a quarta bicicletas da lista.
Python tem uma sintaxe especial para acessar o último elemento em uma lista. Se você pedir o item no índice -1, Python sempre retorna o último item na lista:
print(bicicletas[-1])
Este código retorna o valor 'corrida'. Esta sintaxe é bem útil, porque você frequentemente desejará acessar os últimos itens em uma lista sem saber exatamente o quão longa a lista é. Esta convenção se estende a outros valores de índice negativo também. O índice -2 retorna o penúltimo item da lista, o índice -3 retorna o antepenúltimo item da lista, e assim por diante.
Você pode usar valores individuais de uma lista assim como faria com qualquer outra variável. Por exemplo, você pode usar f-strings para criar uma mensagem com base em um valor de uma lista.
Vamos tentar pegar a primeira bicicleta da lista e compor uma mensagem usando esse valor:
mensagem = f'Minha primeira bicicleta foi uma {bicicletas[0].title()}'
print(mensagem)
Construímos uma frase usando o valor em bicicletas[0] e atribuímos à variável mensagem. A saída é uma frase simples sobre a primeira bicicleta na lista.
Exercício 01: Armazene os nomes de alguns dos seus amigos em uma lista chamada nomes. Imprima o nome de cada pessoa acessando cada elemento na lista, um de cada vez.
Exercício 02: Comece com a lista que você usou no exercício 1, mas em vez de apenas imprimir o nome de cada pessoa, imprima uma mensagem para elas. O texto de cada mensagem deve ser o mesmo, mas cada mensagem deve ser personalizada com o nome da pessoa.
Exercício 03: Pense no seu meio de transporte favorito, como uma motocicleta ou um carro, e faça uma lista que armazene vários exemplos. Use sua lista para imprimir uma série de declarações sobre esses itens, como "Eu gostaria de ter uma moto Honda".
A maioria das listas que você criar será dinâmica, o que significa que você criará uma lista e então adicionará e removerá elementos dela conforme seu programa segue seu curso. Por exemplo, você pode criar um jogo no qual um jogador tem que atirar em alienígenas no céu. Você pode armazenar o conjunto inicial de alienígenas em uma lista e então remover um alienígena da lista toda vez que um for abatido. Cada vez que um novo alienígena aparecer na tela, você o adiciona à lista. Sua lista de alienígenas aumentará e diminuirá de tamanho ao longo do curso do jogo.
A sintaxe para modificar um elemento é similar à sintaxe para acessar um elemento em uma lista. Para alterar um elemento, use o nome da lista seguido pelo índice do elemento que você quer alterar e então forneça o novo valor que você quer que o item tenha.
Por exemplo, digamos que temos uma lista de motos e o primeiro item na lista é 'honda'. Podemos alterar o valor deste primeiro item após a lista ter sido criada:
motos = ['honda', 'yamaha', 'suzuki']
print(motos)
motos[0] = 'ducati'
print(motos)
Aqui definimos a lista de motos, com 'honda' como o primeiro elemento. Então mudamos o valor do primeiro item para 'ducati'. A saída mostra que o primeiro item foi alterado, enquanto o resto da lista permanece o mesmo. Você pode alterar o valor de qualquer item em uma lista, não apenas o primeiro item.
Você pode querer adicionar um novo elemento a uma lista por vários motivos. Por exemplo, você pode querer fazer novos alienígenas aparecerem em um jogo, adicionar novos dados a uma visualização ou adicionar novos usuários registrados a um site que você construiu. O Python fornece várias maneiras de adicionar novos dados a listas existentes.
Acrescentando elementos ao final de uma lista
A maneira mais simples de adicionar um novo elemento a uma lista é anexar o item à lista. Quando você anexa um item a uma lista, o novo elemento é adicionado ao final da lista. Usando a mesma lista que tínhamos no exemplo anterior, adicionaremos o novo elemento 'ducati' ao final da lista:
motos = ['honda', 'yamaha', 'suzuki']
print(motos)
motos.append('ducati')
print(motos)
Aqui, o método append() adiciona 'ducati' ao final da lista, sem afetar nenhum dos outros elementos da lista.
O método append() facilita a construção dinâmica de listas. Por exemplo, você pode começar com uma lista vazia e então adicionar itens à lista usando uma série de chamadas append(). Usando uma lista vazia, vamos adicionar os elementos 'honda', 'yamaha' e 'suzuki' à lista:
motos = []
motos.append('honda')
motos.append('yamaha')
motos.append('suzuki')
print(motos)
A lista resultante é exatamente igual às listas dos exemplos anteriores.
Construir listas dessa forma é muito comum, porque você frequentemente não saberá os dados que seus usuários querem armazenar em um programa até que o programa esteja em execução. Para colocar seus usuários no controle, comece definindo uma lista vazia que conterá os valores dos usuários. Então anexe cada novo valor fornecido à lista que você acabou de criar.
Inserindo elementos em uma lista
Você pode adicionar um novo elemento em qualquer posição da sua lista usando o método insert(). Você faz isso especificando o índice do novo elemento e o valor do novo item:
motos = ['honda', 'yamaha', 'suziki']
motos.insert(0, 'ducati')
print(motos)
Neste exemplo, inserimos o valor 'ducati' no início da lista. O método insert() abre um espaço na posição 0 e armazena o valor 'ducati' naquele local. Esta operação desloca todos os outros valores na lista uma posição para a direita.
Frequentemente, você desejará remover um item ou um conjunto de itens de uma lista. Por exemplo, quando um jogador derruba um alienígena do céu, você provavelmente desejará removê-lo da lista de alienígenas ativos. Ou quando um usuário decide cancelar sua conta em um aplicativo da web que você criou, você desejará remover esse usuário da lista de usuários ativos. Você pode remover um item de acordo com sua posição na lista ou de acordo com seu valor.
Removendo um item usando a instrução del
Se você souber a posição do item que deseja remover de uma lista, poderá usar a instrução del:
motos = ['honda', 'yamaha', 'suziki']
print(motos)
del motos[0]
print(motos)
Aqui usamos a instrução del para remover o primeiro item, 'honda', da lista de motos.
Você pode remover um item de qualquer posição em uma lista usando a instrução del se você souber seu índice. Por exemplo, aqui está como remover o segundo item, 'yamaha', da lista:
motos = ['honda', 'yamaha', 'suziki']
print(motos)
del motos[1]
print(motos)
A segunda motocicleta é excluída da lista. Em ambos os exemplos, você não pode mais acessar o valor que foi removido da lista depois que a instrução del foi usada.
Removendo um item usando o método pop()
Às vezes, você vai querer usar o valor de um item depois de removê-lo de uma lista. Por exemplo, você pode querer obter a posição x e y de um alienígena que acabou de ser abatido, para poder desenhar uma explosão nessa posição. Em um aplicativo da web, você pode querer remover um usuário de uma lista de membros ativos e, em seguida, adicionar esse usuário a uma lista de membros inativos.
O método pop() remove o último item de uma lista, mas permite que você trabalhe com esse item após removê-lo. O termo pop vem de pensar em uma lista como uma pilha de itens e retirar um item do topo da pilha. Nessa analogia, o topo de uma pilha corresponde ao fim de uma lista.
Vamos tirar uma moto da lista de motos:
motos = ['honda', 'yamaha', 'suziki'] # 1
print(motos)
moto_tirada = motos.pop() # 2
print(motos) # 3
print(moto_tirada) # 4
Começamos definindo e imprimindo a lista motos (1). Então, retiramos um valor da lista e atribuímos esse valor à variável moto_tirada (2). Imprimimos a lista (3) para mostrar que um valor foi removido da lista. Então, imprimimos o valor retirado (4) para provar que ainda temos acesso ao valor que foi removido.
A saída mostra que o valor 'suzuki' foi removido do final da lista e agora está atribuído à variável moto_tirada.
Como esse método pop() pode ser útil? Imagine que as motos na lista são armazenadas em ordem cronológica, de acordo com quando as possuímos. Se esse for o caso, podemos usar o método pop() para imprimir uma declaração sobre a última moto que compramos:
motos = ['honda', 'yamaha', 'suzuki']
ultima_compra = motos.pop()
print(f'A última moto que comprei foi a {ultima_compra.title()}')
O resultado é uma frase simples sobre a moto mais recente que compramos.
Retirando itens de qualquer posição em uma lista
Você pode usar pop() para remover um item de qualquer posição em uma lista incluindo o índice do item que deseja remover entre parênteses:
motos = ['honda', 'yamaha', 'suzuki']
primeira_compra = motos.pop(0)
print(f'A primeira moto que comprei foi a {primeira_compra.title()}')
Começamos colocando a primeira moto na lista e então imprimimos uma mensagem sobre essa moto. A saída é uma frase simples descrevendo a primeira moto que tive.
Lembre-se de que cada vez que você usa pop(), o item com o qual você trabalha não é mais armazenado na lista.
Se você não tiver certeza se deve usar a instrução del ou o método pop(), aqui está uma maneira simples de decidir: quando quiser excluir um item de uma lista e não usá-lo de forma alguma, use a instrução del; se quiser usar um item ao removê-lo, use o método pop().
Removendo um item por valor
Às vezes, você não saberá a posição do valor que deseja remover de uma lista. Se você só souber o valor do item que deseja remover, poderá usar o método remove().
Por exemplo, digamos que queremos remover o valor 'ducati' da lista de motos:
motos = ['honda', 'yamaha', 'suzuki', 'ducati']
print(motos)
motos.remove('ducati')
print(motos)
Aqui, o método remove() diz ao Python para descobrir onde 'ducati' aparece na lista e remover esse elemento.
Você também pode usar o método remove() para trabalhar com um valor que está sendo removido de uma lista. Vamos remover o valor 'ducati' e imprimir um motivo para removê-lo da lista:
motos = ['honda', 'yamaha', 'suzuki', 'ducati'] # 1
print(motos)
muito_cara = 'ducati' # 2
motos.remove(muito_cara) # 3
print(motos)
print(f'\nA moto {muito_cara.title()} é muito cara para mim') # 4
Após definir a lista (1), atribuímos o valor 'ducati' a uma variável chamada muito_cara (2). Em seguida, usamos essa variável para informar ao Python qual valor remover da lista (3). O valor 'ducati' foi removido da lista (4), mas ainda é acessível por meio da variável muito_cara, permitindo-nos imprimir uma declaração sobre o motivo pelo qual removemos 'ducati' da lista de motos.
O método remove() exclui apenas a primeira ocorrência do valor que você especificar. Se houver a possibilidade de o valor aparecer mais de uma vez na lista, você precisará usar um loop para garantir que todas as ocorrências do valor sejam removidas.
Exercício 04: Se você pudesse convidar alguém, vivo ou falecido, para jantar, quem você convidaria? Faça uma lista que inclua pelo menos três pessoas que você gostaria de convidar para jantar. Então use sua lista para imprimir uma mensagem para cada pessoa, convidando-as para jantar.
Exercício 05: Você acabou de ouvir que um dos seus convidados não pode ir ao jantar, então você precisa enviar um novo conjunto de convites. Você terá que pensar em outra pessoa para convidar:
Comece com seu programa do exercício 4. Adicione uma chamada print() no final do seu programa, informando o nome do convidado que não pode comparecer.
Modifique sua lista, substituindo o nome do convidado que não pode comparecer pelo nome da nova pessoa que você está convidando.
Imprima um segundo conjunto de mensagens de convite, uma para cada pessoa que ainda está na sua lista.
Exercício 06: Você acabou de encontrar uma mesa de jantar maior, então agora há mais espaço disponível. Pense em mais três convidados para convidar para o jantar:
Comece com seu programa do exercício 4 ou 5. Adicione uma chamada print() ao final do seu programa, informando às pessoas que você encontrou uma mesa maior.
Use insert() para adicionar um novo convidado ao início da sua lista.
Use insert() para adicionar um novo convidado no meio da sua lista.
Use append() para adicionar um novo convidado ao final da sua lista.
Imprima um novo conjunto de mensagens de convite, uma para cada pessoa na sua lista.
Exercício 07: Você acabou de descobrir que sua nova mesa de jantar não chegará a tempo para o jantar e agora você tem espaço para apenas dois convidados:
Comece com seu programa do exercício 6. Adicione uma nova linha que imprima uma mensagem dizendo que você pode convidar apenas duas pessoas para o jantar.
Use pop() para remover convidados da sua lista, um de cada vez, até que restem apenas dois nomes na sua lista. Cada vez que você remover um nome da sua lista, imprima uma mensagem para essa pessoa informando que você lamenta não poder convidá-la para jantar.
Imprima uma mensagem para cada uma das duas pessoas que ainda estão na sua lista, informando que ainda estão convidadas.
Use del para remover os dois últimos nomes da sua lista, para que você tenha uma lista vazia. Imprima sua lista para ter certeza de que você realmente tem uma lista vazia no final do seu programa.
Frequentemente, suas listas serão criadas em uma ordem imprevisível, porque você nem sempre pode controlar a ordem em que seus usuários fornecem seus dados. Embora isso seja inevitável na maioria das circunstâncias, você frequentemente desejará apresentar suas informações em uma ordem específica. Às vezes, você desejará preservar a ordem original de sua lista e, outras vezes, desejará alterar a ordem original. O Python fornece várias maneiras diferentes de organizar suas listas, dependendo da situação.
O método sort() do Python torna relativamente fácil classificar uma lista. Imagine que temos uma lista de carros e queremos alterar a ordem da lista para armazená-los em ordem alfabética. Para manter a tarefa simples, vamos supor que todos os valores na lista sejam minúsculos:
carros = ['bmw', 'audi', 'toyota', 'subaru']
carros.sort()
print(carros)
O método sort() altera a ordem da lista permanentemente. Os carros agora estão em ordem alfabética, e nunca podemos reverter para a ordem original.
Você também pode classificar esta lista em ordem alfabética reversa passando o argumento reverse=True para o método sort(). O exemplo a seguir classifica a lista de carros em ordem alfabética reversa:
carros = ['bmw', 'audi', 'toyota', 'subaru']
carros.sort(reverse=True)
print(carros)
Novamente, a ordem da lista é alterada permanentemente.
Para manter a ordem original de uma lista, mas apresentá-la em uma ordem classificada, você pode usar a função sorted(). A função sorted() permite que você exiba sua lista em uma ordem específica, mas não afeta a ordem real da lista.
Vamos tentar esta função na lista de carros:
carros = ['bmw', 'audi', 'toyota', 'subaru']
print('Lista original:') # 1
print(carros)
print('\nLista ordenada:') # 2
print(sorted(carros))
print('\nLista original de volta:') # 3
print(carros)
Primeiro imprimimos a lista em sua ordem original (1) e depois em ordem alfabética (2). Depois que a lista é exibida na nova ordem, mostramos que a lista ainda está armazenada em sua ordem original (3).
Observe que a lista ainda existe em sua ordem original após a função sorted() ter sido usada. A função sorted() também pode aceitar um argumento reverse=True se você quiser exibir uma lista em ordem alfabética reversa.
Classificar uma lista alfabeticamente é um pouco mais complicado quando todos os valores não estão em minúsculas. Há várias maneiras de interpretar letras maiúsculas ao determinar uma ordem de classificação, e especificar a ordem exata pode ser mais complexo do que queremos lidar neste momento. No entanto, a maioria das abordagens para classificação se baseará diretamente no que você aprendeu nesta seção.
Para reverter a ordem original de uma lista, você pode usar o método reverse(). Se originalmente armazenássemos a lista de carros em ordem cronológica de acordo com quando os possuímos, poderíamos facilmente reorganizar a lista em ordem cronológica reversa:
carros = ['bmw', 'audi', 'toyota', 'subaru']
print(carros)
carros.reverse()
print(carros)
Observe que reverse() não classifica alfabeticamente para trás; ele simplesmente inverte a ordem da lista.
O método reverse() altera a ordem de uma lista permanentemente, mas você pode reverter para a ordem original a qualquer momento aplicando reverse() à mesma lista uma segunda vez.
Você pode encontrar rapidamente o comprimento de uma lista usando a função len(). A lista neste exemplo tem quatro itens, então seu comprimento é 4:
carros = ['bmw', 'audi', 'toyota', 'subaru']
len(carros)
Você achará len() útil quando precisar identificar o número de alienígenas que ainda precisam ser abatidos em um jogo, determinar a quantidade de dados que você precisa gerenciar em uma visualização ou descobrir o número de usuários registrados em um site, entre outras tarefas.
O Python conta os itens em uma lista começando com 1, então você não deve encontrar erros de defasagem de um ao determinar o comprimento de uma lista.
Exercício 08: Pense em pelo menos cinco lugares no mundo que você gostaria de visitar:
Armazene os locais em uma lista. Certifique-se de que a lista não esteja em ordem alfabética.
Imprima sua lista na ordem original. Não se preocupe em imprimir a lista ordenadamente; apenas imprima-a como uma lista Python bruta.
Use sorted() para imprimir sua lista em ordem alfabética sem modificar a lista real.
Mostre que sua lista ainda está na ordem original imprimindo-a.
Use sorted() para imprimir sua lista em ordem alfabética reversa sem alterar a ordem da lista original.
Mostre que sua lista ainda está na ordem original imprimindo-a novamente.
Use reverse() para alterar a ordem da sua lista. Imprima a lista para mostrar que sua ordem mudou.
Use reverse() para alterar a ordem da sua lista novamente. Imprima a lista para mostrar que ela voltou à ordem original.
Use sort() para alterar sua lista para que ela seja armazenada em ordem alfabética. Imprima a lista para mostrar que sua ordem foi alterada.
Use sort() para alterar sua lista para que ela seja armazenada em ordem alfabética reversa. Imprima a lista para mostrar que sua ordem mudou.
Exercício 09: Trabalhando com um dos programas dos exercícios 4 a 7, use len() para imprimir uma mensagem indicando o número de pessoas que você está convidando para jantar.
Exercício 10: Pense em coisas que você poderia armazenar em uma lista. Por exemplo, você poderia fazer uma lista de montanhas, rios, países, cidades, idiomas ou qualquer outra coisa que você queira. Escreva um programa que crie uma lista contendo esses itens e então use cada função introduzida neste capítulo pelo menos uma vez.
Há um tipo de erro que é comum ver quando você está trabalhando com listas pela primeira vez. Digamos que você tem uma lista com três itens e pede o quarto item:
motos = ['honda', 'yamaha', 'suzuki']
print(motos[3])
Este exemplo resulta em um erro de índice.
O Python tenta fornecer o item no índice 3. Mas quando ele pesquisa a lista, nenhum item em motos tem um índice de 3. Devido à natureza de defasagem de um da indexação em listas, esse erro é típico. As pessoas acham que o terceiro item é o item número 3, porque começam a contar em 1. Mas no Python o terceiro item é o número 2, porque começa a indexação em 0.
Um erro de índice significa que o Python não consegue encontrar um item no índice que você solicitou. Se um erro de índice ocorrer no seu programa, tente ajustar o índice que você está solicitando em 1. Em seguida, execute o programa novamente para ver se os resultados estão corretos.
Tenha em mente que sempre que você quiser acessar o último item de uma lista, você deve usar o índice -1. Isso sempre funcionará, mesmo que sua lista tenha mudado de tamanho desde a última vez que você a acessou:
print(motos[-1])
O índice -1 sempre retorna o último item de uma lista, neste caso o valor 'suzuki'.
A única vez que essa abordagem causará um erro é quando você solicita o último item de uma lista vazia:
motos = []
print(motos[-1])
Não há itens em motos, então Python retorna outro erro de índice.
Se ocorrer um erro de índice e você não conseguir descobrir como resolvê-lo, tente imprimir sua lista ou apenas imprimir o comprimento da lista. Sua lista pode parecer muito diferente do que você pensou que era, especialmente se ela foi gerenciada dinamicamente pelo seu programa. Ver a lista real, ou o número exato de itens na sua lista, pode ajudar a resolver esses erros lógicos.
Exercício 11: Se você ainda não recebeu um erro de índice em um dos seus programas, tente fazer um acontecer. Altere um índice em um dos seus programas para produzir um erro de índice. Certifique-se de corrigir o erro antes de fechar o programa.
Neste capítulo, você aprendeu o que são listas e como trabalhar com os itens individuais em uma lista. Você aprendeu como definir uma lista e como adicionar e remover elementos. Você aprendeu como classificar listas permanentemente e temporariamente para fins de exibição. Você também aprendeu como encontrar o comprimento de uma lista e como evitar erros de índice ao trabalhar com listas.
No Capítulo 4, você aprenderá como trabalhar com itens em uma lista de forma mais eficiente. Ao fazer um loop em cada item em uma lista usando apenas algumas linhas de código, você poderá trabalhar de forma eficiente, mesmo quando sua lista contiver milhares ou milhões de itens.