Listas

Teoria Completa

Conhecendo as listas

Cara, até aqui aprendemos sobre os vários tipos de variáveis e como usar estes tipos. Mas às vezes a gente tem muitos dados e pode ser útil agrupá-los. Por exemplo, se precisássemos armazenar as notas de um aluno em três diferentes provas, dava pra fazer algo assim:

Caramba! Imagine o trabalho que seria gerenciar tantas variáveis se fossem 40 notas... E se fossem 3964 alunos com 145 notas cada?! Ok, confesso que seria exagero. Mas o importante é você entender que pode ser muito útil guardar mais de um dado em uma mesma variável, o que é possível com o uso de listas. E vamos discutir sobre como elas funcionam aqui!

Elas são como tabelas: é possível guardar, não apenas um, mas quantos valores você quiser dentro dela e acessar seus dados a partir de um índice. Olha como ficaria se usássemos uma lista:

Agora você colocou todos os valores dentro de uma mesma variável. Você pode pensar em listas como um armário cheio de gavetas que você pode colocar quaisquer coisas dentro. Mas eu imagino que você deve estar se perguntando como acessar cada um dos dados individualmente.

Na verdade, a gente usa a mesma notação que usamos com strings. Eu te mostro! Se liga nesse código aqui:

Repara que usando a notação NOME_DA_LISTA[NUMERO_DA_GAVETA] você pode ler e escrever dados onde quiser dentro de uma lista, mas cuidado aqui: você não pode acessar uma gaveta que não existe! Se sua lista só tem três valores, então você pode acessar os índices (número da gaveta) 0, 1 e 2.

Também é importante lembrar que, como os computadores consideram o zero como um número ordinário, a primeira gaveta tem índice zero, ok?! Hmmm… Você também deve ter percebido alguma semelhança com Strings, né?! De fato, uma lista funciona de forma muito semelhante a uma String.

Existem várias formas de criar uma lista. A mais simples é o uso de colchetes ([ e ]), mas veremos outras maneiras depois!

Uma das coisas mais incríveis de uma lista é que os dados podem ser de qualquer tipo, inclusive outras lista. Olha:

Lista1 é uma lista completamente válida! Na gaveta 0 nós temos o valor String ‘a’, enquanto na gaveta 2 temos um número inteiro 404. Temos também um ponto flutuante (número real) na 3ª gaveta, um valor booleano na 4 e, por fim, uma outra lista na gaveta 5, que por sua vez tem suas próprias gavetas, etc. Mas, nesse caso, qual seria o tamanho da Lista1?

Podemos conferir com o comando len(), o mesmo que utilizamos em Strings, lembra?!

O resultado do comando acima será 6! Uma lista dentro de outra ocupa somente uma gaveta, então, conta como apenas um objeto! Sendo assim, você sabe me dizer como que a gente poderia acessar a String ‘texto’ dentro na Lista1?

A gente ia precisar usar a notação de indexação várias vezes! Se liga só:

Pois você acessa a Lista1 na gaveta 5, que é uma lista, então você acessa a gaveta 3 desta lista, que é outra lista, então você acessa a gaveta 0 desta última lista. Entendeu? Parece confuso, e é mesmo!

Mas continua aqui comigo que cê vai entender, eu juro!

Alterando valores das gavetas

Cara! Se a gente tivesse criado um monte de variáveis independentes, a gente ia poder editar elas livremente. Será que a gente pode fazer o mesmo com dados de uma lista?!

A resposta é que SIMM! Se quiséssemos modificar o valor da quinta gaveta da Lista1, a gente poderia fazer assim:

Bem legal, né?! Mas tem uma coisa que você deve ter notado... Diferentemente de quando estávamos estudando Strings, nós conseguimos mudar o valor de uma lista. Lembra que as Strings são imutáveis? Então... As listas não são! Aqui a gente pode alterar o que quiser dentro delas.

O resultado daquele print() ali foi esse:

O segundo elemento da lista, que era a String ‘b’ no início, passou a ser o número real 3.14, enquanto o quinto elemento passou a ser a String ‘maracujá’ (Sim! Assim como nas Strings também é possível acessar índices negativos, que contam as gavetas de trás para frente!).

Operações com listas

Assim como as strings, alguns operadores matemáticos funcionam com listas. O operador de + funciona como concatenação (união), igualzinho acontece com strings.

E o resultado dessa concatenação ali no print() é esse aqui:

Mas lembra que só dá pra usar esse operador entre listas, ok?! Só dá pra somar lista com lista, assim como só dava pra somar string com string!

Além desse, também dá pra usar o operador de multiplicação pra replicar listas. Mas você só pode multiplicar uma lista por um número inteiro e positivo.

O resultado é esse:

Obs: se multiplicar por um número negativo, a lista resultante vai ser uma lista vazia!

Além dos matemáticos, existem outros operadores que funcionam com listas. Um deles é o del, o mesmo que a gente usava pra apagar variáveis, lembra?! Também dá pra apagar itens da lista!

Repara que os índices das listas são SEMPRE ordenados, sem lacunas. Então, quando a gente apaga o 2 da lista (lista1[1]), nossa lista passa a ser [1,3].

Além desse, tem o operador in. Esse operador checa se um determinado valor existe na lista e, caso exista, retorna True. Se não existir, vai retornar False.

Show de bolinhas! Agora bora sair no soco com os exercícios de fixação!! Eu te espero lá!

Expandir

Exercício Resolvido #1

FGV – 2015, Adaptado

Analise o trecho de programa Python apresentado a seguir. 

Ao ser executado, qual será o resultado exibido?

MOSTRAR SOLUÇÃO COMPLETA

Passo 1

Cara, esse exercício tem a intenção de fixar os fatiamentos de listas. Primeiro, deixa eu tentar te lembrar do que a gente tá falando aqui. As listas são estruturas capazes de armazenar vários dados dentro delas, diferentemente de uma variável normal que só pode guardar uma coisa de cada vez.

Quando a gente quer acessar um dos itens de uma lista, precisa saber qual o índice onde esse item está guardado. Esse índice é simplesmente a ordem do elemento na lista, começando do zero, assim como tá ali na imagem. Pra acessar um elemento específico, usamos colchetes com o índice dentro.

Além disso, também dá pra gente pegar uma fatia dessa lista, usando entre colchetes os índices do DELIMITADORES.

É importante tu sacar que quando estamos pegando fatia de listas (ou strings, pois funcionam da mesma forma), a gente usa os índices dos delimitadores, e não os índices dos valores.

Masss, a última coisinha que tem é que a gente também consegue escolher de quantos em quantos elementos a gente quer pegar.

Depois do segundo : a gente indica de quantos em quantos elementos a gente quer pegar de uma determinada lista. Talvez você esteja se perguntando o que tudo isso tem a ver com o enunciado, mas eu tava rebobinando pra você entender bem o resultado. Acontece que é possível pegar uma sublista, também, de trás pra frente.

Repara que pra gente pegar uma fatia de lista de trás pra frente, usamos os índices negativos. Se liga que quando a gente conta de trás pra frente os delimitadores, eles começam em -1 em vez de 0.

Tudo isso pra você sacar que, se você pegar a lista toda, de -1 em -1 elemento, você pega a lista toda de trás pra frente!

Obs: Quando você não escreve um dos limites da fatia, Python considera o extremo. Por isso, L[::] representa a lista inteira, já que nenhum dos limites da fatia foi definido.

Resposta

Será exibida a lista L inteira, mas de trás pra frente.

Exercício Resolvido #2

PUC-Rio, Adaptado

O Zodíaco chinês é composto por animais com ciclo de 12 anos. Uma maneira simplificada de identificá-lo é verificando-se apenas o ano de seu nascimento do seguinte modo:

Crie um programa que recebe o ano de nascimento do usuário e retorne o signo correspondente.

MOSTRAR SOLUÇÃO COMPLETA

Passo 1

Fala, povo lindo! Se liga, o enunciado tá falando pra gente receber um dado do usuário. Pra todo nosso programa a gente depende dos dados de entrada, então costuma ser uma boa ideia começar o programa pegando esses dados. Pra isso, vamos usar a função input().

Mas se liga que a gente espera que seja digitado um número inteiro, então a gente já faz a conversão direto na resposta da função input() pra que a variável receba um número inteiro.

Não esqueça que a função input(), por padrão, sempre retorna uma string, okay?!

Beleza! Vamos criar nossa lista agora.

Passo 2

Se você não sacou ainda o que esse exercício tem a ver com listas, eu vou te mostrar agora na prática.

Aqui, eu simplesmente criei uma lista, chamada signos, e coloquei dentro os signos que estavam no enunciado, na mesma ordem. A utilidade disso, maninho, é que automaticamente a gente tá relacionando esses nomes com dados numéricos. Lembra que nas listas, todos os elementos têm um índice?! E que esse índice começa em 0 e tem ordem crescente?! Então, doido!

Na memória, a lista tá armazenada assim. Eu abreviei ali pra caber tudo aqui, ok?! Só de criar uma lista de itens, a gente já vai ter números associados aos itens. O item que a gente vai pegar no programa depende do ano de nascimento do usuário!

Passo 3

Se liga, que os índices são idênticos aos valores na tabelinha do enunciado!

O signo do usuário é o resto da divisão inteira do seu ano de nascimento por 12 (isso tá escrito no enunciado, doido). Então, usa aquela lista pra associar o resultado dessa conta com seu respectivo nome. Agora, só precisamos exibir.

Passo 4

Vamos exibir pro usuário o seu signo. Pra isso, vamos usar print() com formatação de string.

Nesse caso, usei formatação de string com f. Mas você podia usar outras formatações, dependendo da qual seu professor costuma usar na sala. Você precisa usar a mesma formatação do seu professor, ok?! Show! Vamos executar esse programa pra testar.

Digitei o ano 1999 e retornou um signo. Viu?! A gente conseguiu relacionar o resultado de uma conta com um elemento da lista. Legal, né?! Te espero no próximo exercício!

Obs: se tu não tá manjando das formatações de string, dá uma olhada no primeiro tópico de string da playlist. Você vai sacar tudo bemmm rapidinho, eu juro, mano!

Resposta

Exercício Resolvido #3

Elaboração própria

Dada a lista S = [1,2,[3,4,[5,6,[7,8,[9,[0]]]]]], responda corretamente:

  1. O tamanho da lista S.
  2. A expressão que troca o 0 da lista por 17.
MOSTRAR SOLUÇÃO COMPLETA

Passo 1

Fala aí, cara! Esse exercício é mais sobre conceitos de listas, e a gente não vai precisar programar pra resolver. Então chega aí, bora pensar um pouquinho. No item A está sendo pedido o tamanho da lista S, e a resposta é 3. Isso porque a lista S só tem 3 elementos, cara!

Sublistas são consideradas como apenas um elemento. Então, a lista mais externa de todas, a gente tem dois números (1 e 2) e uma sublista (essa sublista pode ter outros elementos e outras sublistas). Então, são três itens! Agora, bora pensar sobre como acessar e editar aquele zero ali.

Passo 2

Agora a gente tem que descobrir a notação pra chegar no 0. Se liga nesse desenho que tá ilustrando nossa lista.

Assim como a gente tinha falado sobre no passo 1, a lista S só tem 3 itens, tá vendo?! E o terceiro item é uma sublista que também tem 3 itens. Essa sublista tem outra, etc. Bom, se a gente acessasse o índice S[2], teríamos essa relação:

Ou seja, conseguimos acessar a segunda lista. Mas ainda estamos longe do 0. Mas cara, o resultado da expressão S[2] é uma lista, certo? Então, a gente pode pegar o índice de um elemento da sublista resultado dessa expressão. Por exemplo, S[2][2]: