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

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.

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.

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.

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]
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.

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.

Listas podem conter valores de diferentes tipos.

objetivos = [1, 'Criar listas.', 2, 'Extrair itens de listas.', 3, 'Modificar listas.']

Strings de caracteres podem ser indexadas como listas.

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.

elemento[0] = 'C'
TypeError: 'str' object does not support item assignment

Indexar além do fim de uma coleção é um erro.

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 baixo e cimasão ambos inteiros não-negativos, quão longa é a lista valores[baixo:cima]?

Solução

A lista valores[baixo:cima] tem cima - baixo elementos. Por exemplo, valores[1:4] tem 3 elementos valores[1], valores[2], and valores[3]. Note que a expressão só vai funcionar se cima for menos que o comprimento total da lista valores.

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
  1. O que list('alguma string') faz?
  2. O que '-'.join(['x', 'y', 'z']) gera?

Solução

  1. list('alguma string') converte uma string em uma lista contendo todos os caracteres.
  2. join retorna 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])
  1. Como o Python interpreta um index negativo?
  2. 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?
  3. Se valores é uma lista, o que del valores[-1] faz?
  4. 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.

  1. Python interpreta um index negativo como começando do fim (ao oposto de começar do início). O último elemento é -1.
  2. O último index que pode ser utilizado corretamente com uma lista de N elementos é o elemento -N, que representa o primeiro elemento da lista.
  3. del values[-1] remove o último elemento da lista.
  4. values[:-1]

Degraus em Uma Lista

O que o seguinte programa imprime?

cidade = "florianopolis"
print(cidade[::2])
print(cidade[::-1])
  1. Se escrevermos uma fatia como inicio:fim:degrau, o que degrau faz?
  2. Que expressão iria selecionar todos os elementos em posições pares de uma coleção?

Solução

Esse programa imprime

foinpls
siloponairolf
  1. degrau é o número do ‘passo’ de uma fatia.
  2. A fatia 1::2 seleciona todos os elementos em posições pares de uma lista: começa com o elemento 1 (que é o segundo elemento, já que a indexação começa com 0), vai até o fim (já que fim nã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

sorocaba

A 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) e letras.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 lista letras (a lista original letras permanece inalterada), enquanto letras.sort() ordena a lista letras in-place e retorna None.

Copiando (ou Não)

O que esses dois programas imprimem? Em termos simples, explique a diferença entre novo = velho e novo = 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 = velho torna novo uma referência à lista velho; novo e velho apontam para o mesmo objeto

novo = velho[:] no entanto cria um novo objeto novo contendo todos os elementos da lista velho; novo e velho sã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 del para 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.