Listas
Visão Geral
Perguntas
Como eu posso armazenar muitos valores?
Objetivos
Explicar por que programas precisam de coleções de valores.
Escrever programas que criem, indexem, fatiem e modifiquem listas planas através de assinalação e chamadas de métodos.
Uma lista armazena muitos valores em uma única estrutura
- Fazer operações com cem variáveis chamadas
consumo_001,consumo_002, etc. seriam pelo menos tão lento quanto fazer isso na mão. - Use uma lista (
list) para armazenar vários valores juntos.- A lista fica entre colchetes
[...]. - Valores são separados por vírgula.
- A lista fica entre colchetes
- Use
lenpara descobrir quantos valores tem uma lista.
consumos = [0.273, 0.275, 0.277, 0.275, 0.276]
print('consumos:', consumos)
print('comprimento:', len(consumos))
consumos: [0.273, 0.275, 0.277, 0.275, 0.276]
comprimento: 5
Use o index de um item para selecioná-lo na lista.
- Assim como strings.
print('primeiro item de consumos:', consumos[0])
print('quinto item de consumos:', consumos[4])
primeiro item de consumos: 0.273
quinto item de consumos: 0.276
Os valores da lista podem ser substituídos por assinalação.
- Use uma expressão de index na esquerda da assinalação para substituir um valor.
consumos[0] = 0.265
print('consumos agora é:', consumos)
consumos agora é: [0.265, 0.275, 0.277, 0.275, 0.276]
Apendar itens para uma lista aumenta ela.
- Use
list_name.appendpara adicionar itens ao fim de uma lista.
primos = [2, 3, 5]
print('primos inicialmente é:', primos)
primos.append(7)
print('primos agora é:', primos)
primos inicialmente é: [2, 3, 5]
primos agora é: [2, 3, 5, 7]
appendé um método de listas.- Assim como uma função, mas associado a um objeto em particular.
- Use
nome_objeto.nome_metodopara chamar um método.- Deliberadamente lembra o jeito que nos referimos a coisas de uma biblioteca.
- Vamos encontrar outros métodos de listas a medida que vamos avançando.
- Use
help(list)para um preview.
- Use
extendé similar aappend, mas permite combinar duas listas. Por exemplo:
primos_adolescentes = [11, 13, 17, 19]
primos_meia_idade = [37, 41, 43, 47]
print('primos agora é:', primos)
primos.extend(primos_adolescentes)
print('primos agora virou:', primos)
primos.append(primos_meia_idade)
print('primos finalmente virou:', primos)
primos agora é: [2, 3, 5, 7]
primos agora virou: [2, 3, 5, 7, 11, 13, 17, 19]
primos finalmente virou: [2, 3, 5, 7, 11, 13, 17, 19, [37, 41, 43, 47]]
Note que enquanto extend mantém a estrutura “plana” da lista, apendar uma lista para outra lista torna o resultado bidimensional - o último elemento de primos é uma lista, não um inteiro.
Use del para remover inteiramente itens de uma lista.
- Usamos
del nome_lista[index]para remover um elemento de uma lista (no exemplo, 9 não é um número primo) e então encurtá-la. delnão é uma função ou método, e sim uma declaração (statement) da linguagem.
primos = [2, 3, 5, 7, 9]
print('primos antes de remover o último item:', primos)
del primos[4]
print('primos depois de remover o último item:', primos)
primos antes de remover o último item: [2, 3, 5, 7, 9]
primos depois de remover o último item: [2, 3, 5, 7]
Uma lista vazia não contém valores.
- Use
[]sozinho para representar uma lista que não contém valores.- “O zero das listas.”
- É útil como um ‘ponto de partida’ para coletar valores (o que vamos ver no próximo episódio).
Listas podem conter valores de diferentes tipos.
- Uma única lista pode conter números, strings, e qualquer outra coisa.
objetivos = [1, 'Criar listas.', 2, 'Extrair itens de listas.', 3, 'Modificar listas.']
Strings de caracteres podem ser indexadas como listas.
- Pegue caracteres únicos de uma string de caracteres usando índices em colchetes.
elemento = 'carbono'
print('caracter zero:', elemento[0])
print('caracter três:', elemento[3])
caracter zero: c
caracter três: b
Strings de caracteres são imutáveis.
- Não é possível alterar os caracteres de uma string depois que ela foi criada.
- Imutável: não pode ser alterada depois da criação.
- Em contraste, listas são mutáveis: elas podem ser modificadas (in place).
- Python considera que uma string é um único valor com várias partes, não uma coleção de valores.
elemento[0] = 'C'
TypeError: 'str' object does not support item assignment
- Listas e strings de caracteres são ambas coleções.
Indexar além do fim de uma coleção é um erro.
- Python reporta um
IndexErrorse tentamos acessar um valor que não existe.- Isso é um tipo de erro de runtime.
- Não pode ser detectado quando o código é avaliado porque o index pode ser calculado baseado nos dados.
print('99ésimo elemento de elemento é:', elemento[99])
IndexError: string index out of range
Preencha os Brancos
Preencha os campos em branco para que o programa abaixo produza a saída correta.
valores = ____ valores.____(1) valores.____(3) valores.____(5) print('primeira vez:', valores) valores = valores[____] print('segunda vez:', valores)primeira vez: [1, 3, 5] segunda vez: [3, 5]Solução
valores = [] valores.append(1) valores.append(3) valores.append(5) print('primeira vez:', valores) valores = valores[1:] print('segunda vez:', valores)
Quão Grande é uma Fatia?
Se
baixoecimasão ambos inteiros não-negativos, quão longa é a listavalores[baixo:cima]?Solução
A lista
valores[baixo:cima]temcima - baixoelementos. Por exemplo,valores[1:4]tem 3 elementosvalores[1],valores[2], andvalores[3]. Note que a expressão só vai funcionar secimafor menos que o comprimento total da listavalores.
De Strings para Listas e de Volta
Dado isso:
print('string para lista:', list('latão')) print('lista para string:', ''.join(['o', 'u', 'r', 'o']))string para lista: ['l', 'a', 't', 'ã', 'o'] lista para string: ouro
- O que
list('alguma string')faz?- O que
'-'.join(['x', 'y', 'z'])gera?Solução
list('alguma string')converte uma string em uma lista contendo todos os caracteres.joinretorna uma string que é uma concatenação de cada elemento de string na lista e adicionar o separador entre cada elemento da lista. Isso resulta éx-y-z. O separador entre os elementos é a string que provê esse método.
Trabalhando com o Fim
O que o seguinte programa imprime?
elemento = 'helio' print(elemento[-1])
- Como o Python interpreta um index negativo?
- Se uma lista ou string tem N elementos, qual é o index mais negativo que pode ser usado corretamente com ela, e que localidade esse index representa?
- Se
valoresé uma lista, o quedel valores[-1]faz?- Como você pode mostrar todos os elementos menos o último sem modificar
valores? (Dica: você vai precisar combinar fatias e índices negativos.Solução
The program prints
o.
- Python interpreta um index negativo como começando do fim (ao oposto de começar do início). O último elemento é
-1.- O último index que pode ser utilizado corretamente com uma lista de N elementos é o elemento
-N, que representa o primeiro elemento da lista.del values[-1]remove o último elemento da lista.values[:-1]
Degraus em Uma Lista
O que o seguinte programa imprime?
cidade = "florianopolis" print(cidade[::2]) print(cidade[::-1])
- Se escrevermos uma fatia como
inicio:fim:degrau, o quedegraufaz?- Que expressão iria selecionar todos os elementos em posições pares de uma coleção?
Solução
Esse programa imprime
foinpls siloponairolf
degraué o número do ‘passo’ de uma fatia.- A fatia
1::2seleciona todos os elementos em posições pares de uma lista: começa com o elemento1(que é o segundo elemento, já que a indexação começa com0), vai até o fim (já quefimnão é dado), usa um passo de tamanho `2 (i.e., seleciona a cada dois elementos).
Limites de Fatias
What does the following program print?
cidade = 'sorocaba' print(cidade[0:20]) print(cidade[-1:3])Solução
sorocabaA primeira linha imprime a string inteira, já que a fatia vai além do comprimento total da string. A segunda linha retorna uma string vazia, já que a fatia “sai dos limites” da string.
Ordenar e Ordenada
O que esses dos programas imprimem? Em termos simples, explique a diferença entre
sorted(letras)eletras.sort().# Programa A letras = list('ouro') resultado = sorted(letras) print('letras é', letras, 'e resultado é', resultado)# Programa B letras = list('ouro') resultado = letras.sort() print('letras é', letras, 'e resultado é', resultado)Solução
Programa A imprime
letras é ['o', 'u', 'r', 'o'] e resultado é ['o', 'o', 'r', 'u']Programa B imprime
letras é ['o', 'o', 'r', 'u'] e resultado é None
sorted(letras)retorna uma cópia ordenada da listaletras(a lista originalletraspermanece inalterada), enquantoletras.sort()ordena a listaletrasin-place e retorna None.
Copiando (ou Não)
O que esses dois programas imprimem? Em termos simples, explique a diferença entre
novo = velhoenovo = velho[:].# Program A velho = list('ouro') novo = velho # simple assignment novo[0] = 'D' print('novo é', novo, 'e velho é', velho)# Program B velho = list('ouro') novo = velho[:] # assigning a slice novo[0] = 'D' print('novo é', novo, 'e velho é', velho)Solução
Program A imprime
novo é ['D', 'u', 'r', 'o'] e velho é ['D', 'u', 'r', 'o']Program B imprime
novo é ['D', 'u', 'r', 'o'] e velho é ['o', 'u', 'r', 'o']
novo = velhotornanovouma referência à listavelho;novoevelhoapontam para o mesmo objeto
novo = velho[:]no entanto cria um novo objetonovocontendo todos os elementos da listavelho;novoevelhosão objetos diferentes.
Pontos-chave
Uma lista armazena muitos valores em uma única estrutura.
Use o index de um item para selecioná-lo na lista.
Os valores da lista podem ser substituídos por assinalação.
Apendar itens para uma lista aumenta ela.
Use
delpara remover inteiramente itens de uma lista.Uma lista vazia não contém valores.
Listas podem conter valores de diferentes tipos.
Strings de caracteres podem ser indexadas como listas.
Strings de caracteres são imutáveis.
Indexar além do fim de uma coleção é um erro.