Listas
Teoria
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á!
Alterando valores das gavetas
Operações com listas
Exercícios Resolvidos
Exercício Resolvido #1
FGV – 2015, Adaptado
Analise o trecho de programa Python apresentado a seguir.
Ao ser executado, qual será o resultado exibido?
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.
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:
- O tamanho da lista S.
- A expressão que troca o 0 da lista por 17.
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]:
E assim por diante… Com S[2][2][2][2][1], conseguimos chegar na última lista:
Agora sim, a gente conseguiu chegar na última lista. Agora, a gente só precisa editar o primeiro elemento dessa última lista (que é onde tá o zero). Pra isso, vamos usar mais uma vez a notação de índices:
Dessa forma, conseguimos alterar o 0 pra 17. Essa é a expressão que troca o 0 por 17, e consequentemente, é a resposta da nossa questão!
Resposta
- 3.
- S[2][2][2][2][1][0] = 17
Exercício Resolvido #4
UFRN, 2019
Python é uma linguagem interpretada largamente utilizada atualmente. Não requer tipagem de variáveis e sua sintaxe indentada favorece a organização do código. Uma das suas funcionalidades mais poderosas são as listas. Considere o código em Python do quadro abaixo:
Código:
A saída do programa é?
Passo 1
Fala aí! Nessa questão a gente só precisa analisar o código, não precisamos programar. Bora começar pensando no que acontece na primeira linha. É criada uma variável que recebe a união de duas listas:
O primeiro print() exibe o tamanho dessa lista. Bom, o tamanho da lista é 2, então essa vai ser a primeira saída. Vamos analisar a segunda!
Passo 2
Em seguida, tem a linha que cria uma lista com um quatro dentro e depois quadruplica ela. Nossas variáveis então ficam assim:
O próximo print() exibe o tamanho da lista b, que é 4 (porque tem quatro itens dentro, ok?!). E pronto! Esse exercício era mais pra reforçar o entendimento dos operadores nas listas. Bora pro próximo?!
Resposta
2
4
Exercício Resolvido #5
IFRN, 2017
Observe os seguintes comandos em Python:
Ao término da execução da última linha, o programa deverá imprimir
Passo 1
Fala aí! Essa questão quer testar nossos conhecimentos sobre os operadores em listas. Mas antes, vou te falar uma parada pra você não ficar perdido no que tá acontecendo ali na penúltima linha. É possível definir duas variáveis diferentes na mesma linha usando vírgulas. Olha:
Viu?! As atribuições vão ser feitas respectivamente. Agora, vamos analisar o que tá acontecendo no programa, passo a passo.
Passo 2
Se liga que no programa só tem uma função print(). O enunciado pergunta o que será impresso depois da execução do programa, e só tem um print(). Então, a gente só precisa analisar o que esse print() está imprimindo, ok?! Beleza! Na primeira linha, uma variável de lista foi criada.
Depois, as variáveis i = 1 e j = 2 foram definidas. Mas nosso print() exibe a própria lista x, então o valor de i e j por si só não são importantes pra gente. Agora, a próxima linha que complica um pouco mais a parada.
A pegadinha aqui é que a variável i vai ser atualizada e depois x[i] vai ser atualizado. Quando a gente declara variáveis assim, na mesma linha, as atribuições são feitas uma de cada vez da esquerda pra direita. Isso significa que no x[i] ali, o i não é o i que foi definido antes em i = 1, mas sim o i definido na mesma linha, i = j * 2 - x[j] ** 2.
Na sequência, x[i] = 0. Então, x[3] = 0, sacou?!
Antes dessa linha, as variáveis são:
Depois dela:
Como o print() exibe a variável x, então a resposta é a lista [2, 9, 1, 0].
Resposta
[2, 9, 1, 0]
Exercício Resolvido #6
IFB, 2017 (Adaptado)
Analise o trecho de programa Python apresentado a seguir.
Ao ser executado, qual será o resultado exibido?
Passo 1
Fala aí, doido! Qual elemento está no índice lista[3][2]? A gente precisa descobrir pra resolver essa questão. Primeiro, se liga que a lista grandona tem 4 elementos, ok?! Sublistas contam como somente um item.
E o item de índice 2 é uma sublista. Porém, no enunciado, dentro do print() o cara tá usando o índice 3, que é a string “gato”. E ele pega o índice 2 dessa string. Bora analisar melhor essa parada.
Passo 2
Cara, lista[3] retorna pra gente uma string. E a gente tá ligado que dá pra pegar caracteres individualmente em strings usando índices. Então, lista[3][2] pega a terceira letra da string lista[3], sacou?! (terceira porque a primeira é 0, segunda é 1 e terceira é 2, etc).
Por isso, a resposta é “t”, que é a terceira letra da string “gato”.
É isso, doido! A gente se vê no próximo exercício! Te espero lá!
Resposta
“t”
Exercício Resolvido #7
IFB, 2017 (Adaptado)
Analise o trecho de programa Python apresentado a seguir.
Ao ser executado, qual será o resultado exibido?
Passo 1
E aí, cara! Ao executar esse programa, serão exibidas 5 coisas, já que tem 5 prints. Vamos analisar uma de cada vez, ok?! Começando por numeros[2].
Cara, aqui a gente tá simplesmente pegando o terceiro item da lista e exibindo. Terceiro porque a contagem começa em zero na computação, então o item 2 é o terceiro item. Olha:
Viu? E o terceiro item é o 64, o primeiro a ser exibido. Bora analisar o segundo print()!
Passo 2
Seguindo a mesma lógica do primeiro, aqui vai ser exibido o item de número 7-6. Cara, 7-6 é igual a 1, certo?! E o item um é qual??
É o 32, doido! Pronto! Vamos ver o próximo print.
Passo 3
Agora o print é no índice -1. Tu tá lembrado que dá pra pegar itens contando o índice de trás pra frente?!
Viu?! Funciona da mesma forma que os índices normais, só que começa em -1. Então o elemento -1 sempre é o último da lista, e nesse caso é o 1024. Show! Vamo ver o próximo print!
Passo 4
Agora, o índice é len(numeros)-1. Cara, dá uma olhada de novo nisso aqui:
Tu reparou que o índice do último elemento sempre é o tamanho da lista -1? Nesse caso a lista tem 7 itens, e o último item tá no índice 6, e isso não é coincidência, mano! Sempre vai ser assim. Por isso, nesse print vai ser exibido 1024 de novo.
Passo 5
Agora o último print. O índice 5-7 é igual a 5-7=-2. A lógica é exatamente a mesma que a gente fez no -1.
Índices negativos são contados de trás pra frente, começando no -1. Nesse caso, o -2 é o item 512. Ufa! Esse era o último. Te vejo no próximo exercício, doido!
Resposta
64, 32, 1024, 1024, 512.
Exercício Resolvido #8
FGV, 2014
Uma das estruturas de dados existentes na linguagem de programação Python são as listas. Considere o trecho de código abaixo:
candidatos = ['José', 'João', 'Cibelly', 'Sonivaldo','Dariane']
É CORRETO afirmar que
- candidatos.len() obtem o tamanho da lista.
- o método append é utilizado para adicionar um elemento no início da lista.
- o comando insert('Antônio') insere “Antônio” no início da lista.
- candidatos[-2] retornaria o penúltimo elemento da lista.
- candidatos.size() obtem o tamanho da lista.
Passo 1
Fala aí! Bora analisar cada um dos elementos pra encontrar a resposta. Começando pelo item a, que tá dizendo que a gente pode descobrir o tamanho da lista “candidatos” com o comando candidatos.len(). Isso não é verdade! Pra descobrir o tamanho de uma lista, a gente precisa usar len(candidatos). É parecido, mas não é a mesma coisa, ok?! hahaha
Bora dar uma olhada no segundo item!
Passo 2
Aqui, o doido tá dizendo que a gente pode usar o método append pra adicionar um elemento no inicio da lista. Bom, na verdade esse método existe, mas ele adiciona um item no FINAL da lista, e não no início. Por isso, essa alternativa tá errada também!
Passo 3
No item C tá falando pra gente que dá pra adicionar uma string “Antonio” no início da lista com o método candidatos.insert(“Antonio”). Mas isso também não tá certo não. O método insert() só funciona com dois argumentos! A gente precisa dizer em qual índice a gente quer inserir o novo elemento.
Passo 4
O item d sugere que o índice [-2] corresponde ao penúltimo item da lista. Bom… Tá certo!
Olha, os índices das listas podem ser contados de trás pra frente usando índices negativos. Então, o índice -2 sempre vai referenciar o penúltimo elemento da lista, ok?! Essa é a alternativa certa!!! Mas calma, bora olhar a última.
Passo 5
Pô, aqui na alternativa E tá falando que a gente precisa usar candidatos.size() pra descobrir o tamanho da lista. Mas no item A a gente já debateu sobre isso, e pra descobrir o tamanho de uma lista usamos a função len(), lembra?! len(candidatos).
Por isso, essa alternativa tá errada também, ok?! Te vejo no próximo exercício, doido!
Resposta
Alternativa D.