Listas e tuplas em Python

Listas e tuplas permitem que um programa Python mantenha vários valores sob um único nome. Este material mostra como criar listas, ler itens e fatias pela posição, alterar listas com métodos e processá-las com laços, incluindo tabelas armazenadas como listas de listas. Aborda tuplas e desempacotamento, explica por que duas variáveis podem compartilhar uma lista e como copiar uma lista com segurança, e termina com a ordenação usando sort(), sorted() e funções de chave.

BásicoAula 6 de 10 do curso Curso de Introdução à programação com Python

O que você vai aprender

  1. Crie listas, leia itens individuais e fatias pelo índice, e combine e resuma listas com operadores e funções embutidas do Python.
    • Crie uma lista e leia seus itens pelo índice
      Escreva literais de lista, crie listas com list(), meça seu tamanho com len(), leia itens com índices positivos e negativos e teste o pertencimento com in.
    • Extraia uma fatia de uma lista
      Extraia parte de uma lista com fatias início:parada:passo, preveja o resultado quando valores são omitidos, negativos ou estão fora do intervalo e distinga uma fatia de um item individual.
    • Combine e resuma listas com operadores e funções embutidas
      Una e repita listas com + e *, compare listas, calcule totais, extremos e médias com sum(), min() e max(), e faça conversões entre strings e listas.
  2. Adicione, insira, remova, encontre e substitua itens em uma lista, e use corretamente o efeito e o valor de retorno de cada método.
    • Adicione e remova itens
      Aumente e diminua uma lista com append(), extend(), insert(), pop(), remove(), del e clear(), e distinga seus efeitos e valores de retorno.
    • Encontre, conte e substitua itens
      Localize valores com index(), count() e in, e substitua itens individuais ou intervalos inteiros atribuindo valores a um índice ou a uma fatia.
  3. Visite cada item de uma lista com laços, aplique padrões de contagem, totalização, busca, filtragem e transformação, e trabalhe com listas de listas como tabelas.
    • Percorra itens e posições
      Escolha entre percorrer itens, índices com range(len()) ou ambos com enumerate() e zip(), e altere uma lista com segurança durante o processamento.
    • Aplique padrões comuns de processamento de listas
      Some, conte, encontre extremos, busque, filtre e transforme os itens de uma lista com laços, e reconheça quando uma função embutida faz o mesmo trabalho.
    • Trabalhe com listas aninhadas
      Armazene uma tabela como uma lista de linhas, leia e altere células com dois índices e visite cada célula com laços aninhados.
  4. Armazene grupos fixos de valores em tuplas, decida quando uma tupla é mais adequada que uma lista e desempacote sequências em variáveis separadas.
    • Crie tuplas e escolha entre tuplas e listas
      Escreva tuplas, incluindo tuplas vazias e de um item, leia-as por índice e fatia e explique o que sua imutabilidade permite e impede.
    • Empacote e desempacote valores
      Atribua valores de uma tupla ou lista a várias variáveis de uma vez, troque dois valores, reúna os valores restantes com um nome com asterisco e retorne vários valores de uma função.
  5. Preveja como uma alteração feita por meio de uma variável aparece em outras, copie listas quando for necessária independência e passe listas para funções sem surpresas.
    • Distinga nomes, objetos e referências alternativas
      Explique que variáveis se referem a objetos, reconheça quando dois nomes compartilham uma lista e distinga identidade (is) de igualdade (==) e mutação de nova associação de nome.
    • Copie listas e evite listas internas compartilhadas
      Faça uma cópia independente com fatias, list() ou copy(), reconheça quando uma cópia superficial ainda compartilha listas aninhadas e use uma cópia profunda quando isso não for desejado.
    • Passe listas para funções e retorne-as
      Preveja quando uma função altera a lista do código chamador, escolha entre alterar a própria lista e retornar uma nova, e evite um argumento padrão mutável.
  6. Coloque dados em ordem com sort() e sorted(), de forma crescente ou decrescente, e controle a ordem com funções de chave e a forma como tuplas são comparadas.
    • Ordene com sort() e sorted()
      Escolha entre ordenar a própria lista e criar uma cópia ordenada, ordene em ordem decrescente, distinga inversão de ordenação e preveja como números e strings são ordenados.
    • Ordene por uma chave e ordene registros
      Ordene por uma chave calculada, como tamanho ou texto em minúsculas, ordene listas de tuplas por um ou vários campos e use o fato de que a ordenação do Python é estável.

Guia de estudo de Listas e tuplas em Python

6 capítulos

1

Crie e leia listas

Uma lista dá a um programa um lugar para manter uma coleção ordenada, como notas ou nomes. Suas posições permitem acessar um item específico, enquanto fatias permitem selecionar uma sequência de itens ou percorrer um padrão. Criar, ler e combinar listas envolve vários tipos de resultado: um item individual, uma nova lista, um número ou uma string. Acompanhar esses resultados facilita a escolha da próxima operação e a identificação de um erro de limite.

1.1 Crie uma lista e leia uma posição

Uma lista mantém valores em uma ordem escolhida. Escreva os itens entre colchetes, com vírgulas entre eles. Cada item tem uma posição, portanto valores repetidos ainda ocupam lugares separados.

Crie e meça uma lista
scores = [88, 92, 75]
print(scores)
print(len(scores))

Saída:

[88, 92, 75]
3

len() conta itens, não o maior valor nem a última posição. Listas podem conter tipos diferentes, como em [3, "three", 3.0, True], embora manter dados relacionados juntos geralmente facilite o processamento. [] e list() criam uma lista vazia. Seu tamanho é 0, e ela pode crescer à medida que o programa reúne valores.

list() também pode reunir os itens de um iterável, um objeto que um laço for pode percorrer. list(range(4)) produz [0, 1, 2, 3]. list("cat") produz ['c', 'a', 't']: a string fornece um caractere por vez. O resultado é uma nova lista.

Conte posições a partir de zero

Um índice identifica uma posição. O Python começa em 0, portanto as três notas têm índices 0, 1 e 2.

ExpressãoResultadoPosição
scores[0]88Primeira
scores[1]92Segunda
scores[2]75Terceira
scores[-1]75Última
scores[-2]92Penúltima
scores[-3]88Antepenúltima

Índices negativos contam para trás a partir do fim. Para uma lista de tamanho n, os índices válidos vão de -n até n - 1. O último item é scores[len(scores) - 1], ou, de forma mais simples, scores[-1]. -0 ainda é 0; não significa a última posição.

Reconheça um índice inválido

scores[3] lança IndexError porque não existe um quarto item. scores[len(scores)] comete o mesmo erro: a contagem é uma unidade maior que o último índice não negativo. Uma lista vazia não tem índice de item válido, nem mesmo -1.

Um índice de lista deve ser um inteiro, não um número de ponto flutuante. scores[1.0] lança TypeError, embora 1,0 tenha um valor inteiro. / produz um número de ponto flutuante, portanto scores[len(scores) / 2] também falha. Com essa lista de três itens, len(scores) // 2 produz o inteiro 1, e scores[1] é 92.

Verifique se um valor aparece

O teste de pertencimento verifica valores, não posições:

colors = ["red", "green"]
print("green" in colors)
print("Green" in colors)
print("blue" not in colors)

Saída:

True
False
True

in e not in retornam valores booleanos e também funcionam em listas vazias. Comparações de strings distinguem maiúsculas de minúsculas, portanto "Green" e "green" não correspondem. Um teste de pertencimento é útil antes de uma operação que exige que um valor esteja presente, como removê-lo ou encontrar sua posição.

Principais conclusões

  • Listas preservam a ordem e podem conter valores repetidos.
  • len(values) conta itens; o último índice não negativo é len(values) - 1.
  • Índices negativos contam a partir do fim, começando em -1.
  • Um índice de item inválido lança IndexError; um índice de ponto flutuante lança TypeError.
  • in testa se um valor igual aparece na lista.

1.2 Extraia uma fatia de uma sequência

Uma fatia seleciona uma sequência de itens e retorna uma nova sequência. Para uma lista, o resultado é outra lista, mesmo quando ela contém apenas um item ou nenhum.

Inclua o início e exclua o limite de parada
letters = ["a", "b", "c", "d", "e", "f"]
print(letters[1:4])

Saída:

['b', 'c', 'd']

As posições selecionadas são 1, 2 e 3. A posição 4 é o limite de parada, portanto 'e' fica de fora. Com passo 1 e limites que atendem a 0 <= start <= stop <= len(letters), o número de itens selecionados é stop - start. Aqui são 3. letters[4:2] produz [] porque uma fatia percorrida para a frente não alcança um limite de parada anterior.

Omita um limite
FatiaSignificadoResultado
letters[:2]Primeiros dois itens['a', 'b']
letters[4:]Da posição 4 até o fim['e', 'f']
letters[:]Todos os itens em uma nova lista['a', 'b', 'c', 'd', 'e', 'f']
letters[-2:]Últimos dois itens['e', 'f']
letters[:-1]Todos, exceto o último['a', 'b', 'c', 'd', 'e']

Limites negativos contam a partir do fim, assim como índices negativos. letters[:n] e letters[n:] dividem a lista em um limite. Juntar essas duas fatias reconstrói seu conteúdo na ordem original.

Controle o passo

A forma completa é values[start:stop:step]. Um passo de 2 seleciona uma posição, pula uma e seleciona a próxima. letters[::2] produz ['a', 'c', 'e'], enquanto letters[1::2] produz ['b', 'd', 'f'].

Um passo negativo percorre para trás. letters[::-1] começa no último item e produz ['f', 'e', 'd', 'c', 'b', 'a']. Para uma fatia com limites percorrida para trás, letters[4:1:-1] visita os índices 4, 3 e 2, produzindo ['e', 'd', 'c']; o limite de parada continua excluído. Um passo 0 lança ValueError porque não permite avançar para outra posição.

Distinga um limite de uma posição

Os limites de uma fatia podem ultrapassar qualquer extremidade. O Python os ajusta: letters[4:100] é ['e', 'f'], e letters[10:] é []. Essas fatias não lançam IndexError. Ler o item individual letters[10] lança esse erro.

letters[2] é a string 'c'. letters[2:3] é a lista ['c']. Os dois-pontos alteram o tipo de resultado, o que importa quando o código posterior espera uma string ou uma lista.

Trabalhe com o resultado

Após first_three = letters[:3], a atribuição first_three[0] = "z" altera apenas essa nova lista externa; letters[0] continua sendo 'a'. Uma fatia completa é uma cópia superficial, portanto itens mutáveis aninhados ainda podem ser compartilhados.

Strings e tuplas seguem as mesmas regras de limites e passos. O resultado mantém o tipo da sequência original: "python"[1:4] produz 'yth', e (10, 20, 30)[1:] produz (20, 30).

Principais conclusões

  • Uma fatia inclui seu início e exclui seu limite de parada.
  • Limites omitidos selecionam até a extremidade correspondente da sequência.
  • O passo controla a direção e o espaçamento; zero é inválido.
  • Limites de fatia fora do intervalo são ajustados às extremidades.
  • Uma consulta por índice retorna um item; uma fatia retorna uma sequência.
  • Uma fatia de lista cria uma nova lista externa.

1.3 Combine valores e calcule resumos

Listas oferecem operadores para criar sequências e funções para resumir seus valores. Verifique se uma operação cria uma nova lista, produz um número ou retorna texto: esses resultados servem a propósitos diferentes.

Una ou repita listas

+ une duas listas e cria uma nova lista. [1, 2] + [3] produz [1, 2, 3] sem alterar nenhuma das entradas. Ambos os operandos devem ser listas: [1, 2] + 3 lança TypeError. Coloque um valor extra individual em uma lista de um item ao usar +.

* repete a sequência. [0] * 4 produz [0, 0, 0, 0], e ["ab", "cd"] * 2 produz ['ab', 'cd', 'ab', 'cd']. Ele repete itens, não os caracteres dentro de cada string. Uma contagem de repetição zero ou negativa produz []. counts = [0] * 7 fornece sete contadores iniciais. Repetir uma lista interna a compartilha entre posições, o que importa quando essas linhas são alteradas depois.

Total, extremos e média
ExpressãoResultado
sum([4, 8, 15])27
min([4, 8, 15])4
max([4, 8, 15])15
sum([])0

sum() soma números. Ela não une strings; sum(["a", "b"]) lança TypeError. min() e max() encontram os menores e maiores itens, portanto os itens devem aceitar comparação entre si. Listas compostas apenas de strings funcionam: max(["pear", "apple"]) produz 'pear' pela ordenação caractere por caractere. Uma lista vazia não tem mínimo nem máximo e lança ValueError em qualquer uma das chamadas.

A média aritmética é o total dividido pelo número de itens:

temps = [18.5, 21.0, 19.5, 23.0]
if temps:
    total = sum(temps)
    mean = total / len(temps)
    print(total, mean)

Saída:

82.0 20.5

A condição funciona porque listas vazias são consideradas falsas e listas não vazias são consideradas verdadeiras. Sem a verificação de proteção, calcular a média de [] dividiria por zero e lançaria ZeroDivisionError. Escolha o que o programa deve fazer quando não houver medições, como retornar None.

Compare sequências em ordem

== verifica se há itens iguais em posições correspondentes. [1, 2, 3] == [1, 2, 3] é True; [1, 2, 3] == [3, 2, 1] é False.

Para < e >, compare da esquerda para a direita e pare no primeiro par diferente. [2, 9] < [3, 0] é True porque 2 é menor que 3. O 9 e o 0 não decidem nada. Quando uma lista é o início de outra, a mais curta vem primeiro: [2] < [2, 0] é True.

Passe de texto para listas e vice-versa
colors = "red,green,blue".split(",")
print(colors)
print(", ".join(["red", "green"]))

Saída:

['red', 'green', 'blue']
red, green

split() divide uma string em seu separador. join() é chamado sobre o separador e o coloca entre as strings fornecidas. Cada item deve ser uma string. Para juntar números, crie primeiro uma lista dos resultados de str(); passar [1, 2] diretamente a join() lança TypeError.

Principais conclusões

  • + une listas; * repete sua sequência de itens.
  • sum, min e max produzem valores resumidos.
  • Verifique se a lista está vazia antes de calcular uma média ou um extremo.
  • A comparação de sequências usa a ordem dos itens e o primeiro par diferente.
  • split cria partes de texto; join de um separador combina strings.
2

Altere uma lista

Uma lista de compras cresce, uma fila perde seu primeiro item e um preço registrado precisa de correção. O Python oferece métodos de lista e atribuição para essas alterações. A escolha depende de você conhecer um valor ou uma posição, precisar de um item ou de vários, e precisar guardar um item removido. Prestar atenção ao valor de retorno de um método evita que uma alteração na lista substitua acidentalmente seu nome por None.

2.1 Adicione e remova itens de uma lista

Listas são mutáveis: um programa pode alterar seu conteúdo depois de criá-las. Um método pertence a um objeto e é chamado com um ponto, como em cart.append("eggs"). Seu efeito sobre a lista e seu valor de retorno são duas coisas distintas.

Adicione um item ou vários
cart = ["milk"]
cart.append("eggs")
cart.extend(["tea", "jam"])
print(cart)

Saída:

['milk', 'eggs', 'tea', 'jam']

append(x) adiciona exatamente um item ao final. Se x for uma lista, essa lista inteira se torna um item aninhado. Começando com ['milk', 'eggs'], cart.append(["tea", "jam"]) produz ['milk', 'eggs', ['tea', 'jam']], de tamanho 3.

extend(iterable) adiciona separadamente os itens fornecidos pelo iterável. Estender com ["tea", "jam"] faz o carrinho ter tamanho 4. Estender com "ab" adiciona 'a' e 'b' separadamente; acrescente a string para manter 'ab' como um item.

insert(i, x) adiciona um item antes da posição atual i. Após nums = [10, 30] e nums.insert(1, 20), a lista é [10, 20, 30]. Os itens seguintes são deslocados para a direita. insert(0, x) adiciona no início; um índice além do fim adiciona no final sem erro de índice.

Remova por posição ou valor
OperaçãoUsaRetorna
items.pop()Última posiçãoItem removido
items.pop(i)Posição iItem removido
items.remove(x)Primeiro valor igual a xNone
del items[i]Posição iNenhum valor de retorno
del items[start:stop]Fatia de posiçõesNenhum valor de retorno
items.clear()Lista inteiraNone

Com nums = [10, 20, 30], last = nums.pop() salva 30 e deixa [10, 20]. nums.pop(0) então retorna 10 e deixa [20]. Uma lista vazia ou uma posição inválida faz pop() lançar IndexError.

remove() recebe um valor. Com pets = ["cat", "dog", "cat"], pets.remove("cat") deixa ['dog', 'cat']. Apenas a primeira correspondência desaparece. Se o valor estiver ausente, remove() lança ValueError. Use um teste de pertencimento quando ele puder estar ausente. Para remover cada 'cat', use:

while "cat" in pets:
    pets.remove("cat")

Com [5, 0, 7], remove(0) remove o valor 0 e deixa [5, 7]; pop(0) remove o valor na posição 0, produzindo [0, 7]. O significado do argumento determina o método.

del pode excluir um intervalo: a partir de [5, 6, 7, 8], del nums[1] deixa [5, 7, 8], e del nums[0:2] deixa então [8]. clear() deixa a lista existente vazia.

Entenda o valor de retorno

append, extend, insert, remove e clear retornam None. Escreva cart.append("tea") em uma linha própria. Escrever cart = cart.append("tea") faz cart se referir a None; uma chamada posterior de cart.append("jam") lança AttributeError. Salve o resultado de um método apenas quando ele fornecer um valor necessário ao programa, como faz last = cart.pop().

Principais conclusões

  • append adiciona um item; extend adiciona cada item fornecido.
  • insert adiciona antes de uma posição e desloca os itens seguintes.
  • pop remove por posição e retorna o item.
  • remove exclui o primeiro valor igual e falha se ele estiver ausente.
  • del exclui posições ou fatias; clear esvazia a mesma lista.
  • Métodos como append retornam None, portanto não atribua esse resultado de volta à lista.

2.2 Encontre valores e substitua itens

Encontrar um valor, contá-lo e substituí-lo são operações diferentes. Use um teste de pertencimento quando precisar de uma resposta sim ou não, um método de busca quando precisar de uma posição e uma atribuição quando quiser que a lista mude.

Encontre a primeira posição correspondente
days = ["Mon", "Tue", "Wed", "Tue"]
print(days.index("Tue"))
print(days.index("Tue", 2))
print(days.count("Tue"))
print(days.count("Sun"))

Saída:

1
3
2
0

index(x) retorna a primeira posição que contém um valor igual a x. Seu argumento inicial opcional informa ao Python onde começar a busca. days.index("Tue", 2) ignora a correspondência na posição 1 e encontra a da posição 3. A resposta continua sendo um índice da lista inteira, não uma contagem a partir do novo ponto inicial.

index() lança ValueError quando o valor está ausente. Listas não têm um método find() que retorne -1. Se for esperado que um valor esteja ausente, teste primeiro o pertencimento:

if "Sun" in days:
    position = days.index("Sun")
    print(position)

Esse código não imprime nada porque 'Sun' está ausente. count(x) pode ser usado sem essa verificação de proteção: ele retorna 0 quando não há correspondências. Essas operações usam igualdade, portanto [1, 2.0].count(2) é 1. O texto ainda respeita maiúsculas e minúsculas: 'tue' não é igual a 'Tue'.

Substitua um item existente
prices = [4.5, 3.0, 7.25]
prices[1] = 3.5
print(prices)

Saída:

[4.5, 3.5, 7.25]

O antigo segundo valor é sobrescrito e o tamanho permanece 3. O índice deve existir: prices[3] = 1.0 lança IndexError. Para adicionar ao final, use append().

InstruçãoEfeito sobre [10, 20]
nums[0] = 99[99, 20]
nums.insert(0, 99)[99, 10, 20]

A substituição usa uma posição existente. A inserção cria uma posição extra antes da posição selecionada.

Substitua um intervalo com atribuição a fatia
nums = [1, 2, 3, 4, 5]
nums[1:3] = [20, 30, 40]
print(nums)
nums[0:2] = []
print(nums)

Saída:

[1, 20, 30, 40, 4, 5]
[30, 40, 4, 5]

A primeira atribuição substitui os dois itens nos índices 1 e 2 por três novos itens, aumentando a lista em um. Uma fatia contígua comum pode ser substituída por uma sequência menor ou maior. Atribuir [] exclui o intervalo selecionado. Isso altera a lista original; é diferente de ler uma fatia em uma nova variável.

Edite texto criando um novo texto

Uma string é imutável, portanto word = "cat" seguido de word[0] = "b" lança TypeError. Crie uma nova string com word = "b" + word[1:], ou crie uma lista de caracteres, altere-a e junte seus itens:

letters = list("cat")
letters[0] = "b"
word = "".join(letters)
print(word)

Saída:

bat

Principais conclusões

  • index retorna a primeira posição correspondente e lança ValueError para um valor ausente.
  • count retorna o número de itens iguais, incluindo zero.
  • A atribuição a item substitui uma posição que já existe.
  • A atribuição a uma fatia contígua pode alterar o tamanho de uma lista.
  • Strings precisam ser recriadas em vez de alteradas por atribuição a item.
3

Processe listas com laços

Laços transformam uma coleção armazenada em resultados úteis: um total, uma posição correspondente, uma lista filtrada ou uma tabela alterada. Cada tarefa começa com a escolha do que manter ao longo do laço e das informações que ele precisa de cada item. Algumas tarefas precisam apenas de valores, outras precisam de posições ou de registros pareados. Listas aninhadas acrescentam mais um nível a acompanhar, portanto processar uma tabela significa percorrer suas linhas e depois suas células.

3.1 Percorra itens e posições

Um laço pode usar os valores de uma lista, suas posições ou ambos. Escolha a forma que forneça o que o corpo do laço precisa. Para alterar a lista, verifique também se a instrução altera um item ou apenas associa um nome local a outro valor.

Use os itens diretamente
for name in ["Ana", "Ben"]:
    print("Hi", name)

Saída:

Hi Ana
Hi Ben

O laço visita cada item em ordem. A cada passagem, name se refere ao item atual. Atribuir um valor diferente a name não substitui esse item na lista. Em for r in readings: r = 0, apenas o nome r muda.

Use posições para substituir itens
readings = [3, -1, 4, -5]
for i in range(len(readings)):
    if readings[i] < 0:
        readings[i] = 0
print(readings)

Saída:

[3, 0, 4, 0]

range(len(readings)) fornece 0, 1, 2 e 3. No índice 1, a condição é verdadeira, portanto a atribuição a item substitui -1. No índice 3, ela substitui -5. As medições positivas mantêm seus valores. Usar range(len(readings) + 1) também alcançaria o índice 4, que não existe.

Obtenha uma posição e um item juntos

enumerate() fornece pares. Desempacote cada par no cabeçalho do laço:

for i, name in enumerate(["Ana", "Ben"]):
    print(i, name)

Saída:

0 Ana
1 Ben

enumerate(names, start=1) fornece rótulos a partir de 1 para uma exibição numerada. Esses rótulos deixam de ser os índices da lista contados a partir de zero. Para visitar do último ao primeiro sem alterar a lista, use for item in reversed(names):. Para índices em ordem inversa, use range(len(names) - 1, -1, -1); uma lista de três itens produz 2, 1, 0.

Forme pares com duas listas
names = ["Ana", "Ben"]
scores = [90, 85]
for name, score in zip(names, scores):
    print(name, score)

Saída:

Ana 90
Ben 85

zip() forma pares com itens em posições correspondentes e para na entrada mais curta. Se todos os registros forem necessários, verifique os tamanhos antes de usá-lo; caso contrário, um nome final sem par será ignorado.

Controle um índice com while

Um laço while precisa de um índice inicial, uma verificação de limite e um passo:

i = 0
while i < len(readings):
    print(readings[i])
    i += 1

Esquecer o incremento impede que esse laço termine. Usar <= alcança len(readings) e causa IndexError.

Evite deslocar itens durante um laço for

Remover itens altera as posições dos que vêm depois. Com [1, 2, 2, 3], remover cada 2 encontrado enquanto percorre a mesma lista deixa [1, 2, 3]: o segundo 2 é deslocado para a posição recém-visitada. Percorra nums[:] se as remoções precisarem afetar a original, ou crie uma nova lista com os itens a manter. Adicionar itens à lista percorrida também pode fazer o laço se comportar de forma inesperada.

Principais conclusões

  • Use um laço direto para itens, range(len(...)) para posições e enumerate para ambos.
  • Associar a variável do laço a outro valor não substitui um item da lista.
  • zip para na entrada mais curta.
  • reversed percorre para trás sem alterar a lista.
  • Um laço while deve avançar seu índice e parar antes de len(values).
  • Crie uma nova lista ou percorra uma cópia ao remover itens.

3.2 Crie totais, buscas e novas listas

Muitos problemas com listas usam alguns padrões de laço reutilizáveis. Decida qual resultado o programa precisa, prepare esse resultado antes do laço e atualize-o à medida que cada item chega.

Acumule um total ou uma contagem
sales = [120, 75, 205, 50]
total = 0
for sale in sales:
    total += sale
print(total)

Saída:

450

O total acumulado passa a ser 120, 195, 400 e 450. Definir total = 0 dentro do laço apagaria o trabalho anterior a cada passagem. sum(sales) calcula esse total diretamente.

Um contador adiciona 1 para cada item que atende à condição, não o valor do item:

scores = [72, 45, 60, 88, 59]
passed = 0
for score in scores:
    if score >= 60:
        passed += 1
print(passed)

A saída é 3: 72, 60 e 88 atendem à condição. > 60 produziria 2 porque exclui exatamente 60. Mantenha a descrição do valor limiar e a comparação em concordância.

Encontre um extremo

Para uma lista não vazia, inicialize um máximo acumulado a partir de um item real:

temps = [-3, -8, -1, -5]
highest = temps[0]
for temp in temps[1:]:
    if temp > highest:
        highest = temp
print(highest)

A saída é -1. Começar em 0 manteria 0 incorretamente porque todas as medições são menores. Use < para encontrar o mínimo ou use as funções embutidas min() e max(). Verifique se a lista está vazia antes de acessar seu primeiro item.

Pare na primeira correspondência
values = [4, 0, -2, 5, -7]
position = -1
for i, value in enumerate(values):
    if value < 0:
        position = i
        break
print(position)

A saída é 2. -1 é um sinal escolhido para indicar ausência de correspondência; não o use como índice a menos que a busca tenha tido sucesso, pois ele também é um índice válido para o último item. break preserva a primeira posição correspondente. Sem ele, correspondências posteriores sobrescreveriam o resultado.

x in values testa um valor exato, e values.index(x) encontra sua primeira posição. Uma condição como “é negativo” precisa de uma busca baseada em condição, como o laço acima.

Filtre ou transforme

Um filtro mantém itens originais selecionados:

passing = []
for score in scores:
    if score >= 60:
        passing.append(score)
print(passing)

A saída é [72, 60, 88]; scores mantém todos os cinco itens. Uma transformação calcula um novo item a partir de cada item original:

nums = []
for text in ["3", "14", "15"]:
    nums.append(int(text))
print(nums, sum(nums))

A saída é [3, 14, 15] 32. A conversão acontece antes da adição; somar as strings originais falha.

Retorne um resultado reutilizável
def average(values):
    if not values:
        return None
    return sum(values) / len(values)

average([18.5, 21.0, 19.5, 23.0]) retorna 20.5. O caso vazio retorna None sem dividir por zero, e a função deixa a lista de entrada inalterada.

Principais conclusões

  • Inicialize um acumulador antes do laço.
  • Um contador adiciona 1 por correspondência; um total soma valores.
  • Comece um extremo acumulado a partir de um item real.
  • Use break para manter a primeira correspondência em uma busca.
  • A filtragem seleciona itens; a transformação calcula novos valores.
  • Uma função que retorna um resultado permite que o código chamador o mantenha sem alterar a entrada.

3.3 Leia e processe uma tabela de linhas

Uma lista aninhada é uma lista que contém outras listas. Uma tabela costuma usar uma lista interna por linha. Cada consulta seleciona um nível, portanto ler uma célula exige dois índices.

Selecione a linha e depois a célula
grid = [[1, 2, 3], [4, 5, 6]]
print(grid[1])
print(grid[1][2])
print(len(grid), len(grid[0]))

Saída:

[4, 5, 6]
6
2 3

grid[1] seleciona a segunda linha; [2] seleciona então o terceiro item dessa linha. len(grid) conta linhas, enquanto len(grid[0]) conta células na primeira linha. Essa tabela retangular tem seis células. grid[2][1] falha na primeira consulta porque a linha 2 não existe. Trocar as posições de linha e coluna pode selecionar a célula errada ou lançar IndexError.

Altere uma célula ou uma linha inteira

grid[0][1] = 20 altera a segunda célula da primeira linha, produzindo [[1, 20, 3], [4, 5, 6]]. grid[0] = [0, 0, 0] substitui a primeira linha inteira. O número de consultas mostra qual nível está sendo substituído.

Visite cada valor
grid = [[1, 2, 3], [4, 5, 6]]
total = 0
for row in grid:
    for value in row:
        total += value
print(total)

Saída:

21

O laço interno conclui a primeira linha antes de o laço externo fornecer a segunda. Ele soma 1, 2, 3 e depois 4, 5, 6. O total de uma coluna usa uma posição fixa de cada linha:

column_total = 0
for row in grid:
    column_total += row[1]
print(column_total)

A saída é 7, obtida de 2 e 5. Esse código exige que cada linha tenha um segundo item.

As linhas não precisam ter o mesmo tamanho. [[1], [2, 3]] é uma lista aninhada válida. Laços aninhados diretos ainda visitam cada valor porque cada laço interno percorre sua própria linha. Supor que todas as linhas tenham len(grid[0]) itens deixaria de fora valores neste caso. Para contar células em uma tabela assim, some len(row) para cada linha.

Crie linhas independentes
table = []
for r in range(3):
    table.append([0] * 4)
table[0][0] = 1
print(table)

Saída:

[[1, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]

Cada passagem cria uma nova lista de quatro itens. O atalho [[0] * 4] * 3 repete uma referência a uma linha; alterar sua primeira célula apareceria nas três linhas.

Armazene registros

Uma linha pode descrever um registro em vez de uma linha de números. Com students = [["Ana", 90], ["Ben", 85]], students[1][0] é 'Ben' e students[1][1] é 85. Quando cada registro tem dois itens, for name, score in students: os desempacota em nomes úteis. Listas de tuplas podem representar o mesmo tipo de registro.

Principais conclusões

  • Dois índices selecionam uma linha e depois uma célula nessa linha.
  • len(grid) conta linhas; os tamanhos das linhas podem ser diferentes.
  • Laços aninhados processam cada linha com seu próprio laço interno.
  • Uma consulta de coluna exige que essa posição exista em cada linha selecionada.
  • Crie cada linha mutável separadamente para evitar células compartilhadas.
4

Use tuplas e desempacotamento

Grupos fixos de valores frequentemente têm posições com significado: um ponto tem coordenadas, e um registro de resultado tem um nome e uma nota. Tuplas mantêm essas posições fixas, enquanto o desempacotamento dá a cada valor um nome útil. Essas ferramentas também explicam como uma atribuição pode trocar dois valores e como uma função pode retornar vários resultados. Uma tupla externa imutável ainda pode conter uma lista alterável, portanto acompanhe tanto o contêiner quanto os objetos dentro dele.

4.1 Escolha uma lista ou uma tupla

Uma tupla armazena itens em ordem, como uma lista, mas suas posições não podem ser substituídas, adicionadas ou removidas. Isso é imutabilidade. Tuplas são adequadas para grupos fixos, como coordenadas, datas e registros; listas são adequadas para coleções que crescem ou mudam.

Crie e leia uma tupla
point = (3, 4)
date = (2024, 7, 15)
print(date[0])
print(date[1:])
print(len(date))

Saída:

2024
(7, 15)
3

A indexação de tuplas, os índices negativos, as fatias e os testes de pertencimento seguem as mesmas regras das listas. Uma fatia de tupla retorna uma tupla. Você pode percorrer uma tupla com um laço ou usar +, *, min, max, sum, count e index quando seus itens forem adequados à operação.

A vírgula cria uma tupla não vazia. t = 3, 4 cria (3, 4) mesmo sem parênteses. Uma tupla de um item precisa de uma vírgula final:

ExpressãoValor e tipo
(5)Inteiro 5
(5,)Tupla de um item (5,)
()Tupla vazia
tuple([1, 2])Tupla (1, 2)
tuple("ab")Tupla ('a', 'b')

list(t) converte os itens de uma tupla em uma lista alterável.

Entenda o que não pode mudar

point[0] = 5 lança TypeError porque uma tupla não aceita atribuição a item. Tuplas não têm os métodos append, remove ou sort; point.append(5) lança AttributeError.

Um nome ainda pode ser associado a uma nova tupla:

point = (3, 4)
point = (5,) + point[1:]
print(point)

A saída é (5, 4). A expressão cria uma nova tupla; ela não edita a antiga.

Uma tupla pode conter um item mutável
t = ([1, 2], "x")
t[0].append(3)
print(t)

Saída:

([1, 2, 3], 'x')

A primeira posição ainda contém a mesma lista. O conteúdo dessa lista mudou. t[0] = [9] substituiria o objeto na posição e é proibido. A imutabilidade da tupla externa não congela uma lista interna.

Escolha a estrutura adequada à tarefa

Use (x, y) para uma coordenada, (255, 128, 0) para uma cor RGB ou ("Ana", 90) para um registro de dois campos. Cada posição tem um significado específico. Use uma lista para todas as notas da turma ou os itens de um carrinho, que podem crescer e ser reordenados. Uma lista de tuplas, como [("Ana", 90), ("Ben", 85)], combina uma coleção alterável com posições fixas nos registros.

Uma tupla de números ou strings pode servir como chave de dicionário, como em {(0, 0): "origin"}. As chaves devem ser hasháveis, ou seja, devem atender às regras do Python para consultas estáveis por chave. Uma lista não é hashável, e uma tupla que contém uma lista também não é hashável.

Compare tuplas

A comparação começa pela esquerda e para no primeiro par diferente. (1, 2, 5) < (1, 3, 0) é True: os primeiros valores são iguais, e 2 é menor que 3. Essa mesma regra ordena uma lista de registros em tuplas quando nenhuma função de chave é fornecida.

Principais conclusões

  • Uma tupla tem posições de itens fixas, mas pode conter um objeto mutável.
  • A vírgula cria uma tupla não vazia; (5,) tem um item.
  • As operações de leitura de tuplas seguem as regras de sequências.
  • Associar o nome de uma tupla a outro objeto cria um valor diferente sem editar a tupla antiga.
  • Tuplas usadas como chaves de dicionário precisam ter conteúdo hashável.
  • A comparação de tuplas usa o primeiro par de itens diferentes.

4.2 Desempacote registros em nomes

O empacotamento reúne valores em uma tupla. O desempacotamento atribui os itens de um iterável a nomes em ordem. Juntos, eles permitem que o código dê nomes claros aos campos de um registro e receba vários resultados de uma função.

Associe nomes a valores
record = "Ana", 34, "Lima"
name, age, city = record
print(name, age, city)

Saída:

Ana 34 Lima

O primeiro item se torna name, o segundo age e o terceiro city. O desempacotamento também funciona em listas e strings: first, second = [10, 20] e a, b, c = "xyz" atribuem seus itens em ordem. user, domain = "ana@example.com".split("@") produz 'ana' e 'example.com' porque a divisão produz duas partes.

Sem um nome com asterisco, as quantidades devem corresponder exatamente. x, y = (1, 2, 3) lança ValueError por excesso de valores; x, y, z = (1, 2) lança ValueError por falta de valores. O Python não descarta itens extras sem aviso.

Troque valores com segurança
a = 1
b = 2
a, b = b, a
print(a, b)

A saída é 2 1. O Python avalia todo o lado direito usando os valores antigos antes de atribuir qualquer nome à esquerda. A tentativa com duas instruções, a = b seguida de b = a, perde o valor antigo de a e faz ambos os nomes valerem 2.

Reúna os itens restantes

Um nome com asterisco recebe uma lista dos valores restantes:

first, *rest = [5, 6, 7, 8]
print(first, rest)
*init, last = [5, 6, 7, 8]
print(init, last)

Saída:

5 [6, 7, 8]
[5, 6, 7] 8

O asterisco também pode aparecer entre nomes sem asterisco: first, *middle, last = (5, 6, 7, 8) atribui a middle a lista [6, 7]. O objeto reunido é sempre uma lista, mesmo ao desempacotar uma tupla. head, *rest = [5] deixa rest como []. Deve haver itens suficientes para os nomes sem asterisco, e apenas um nome com asterisco é permitido no mesmo padrão de desempacotamento.

Desempacote durante um laço
for name, score in [("Ana", 90), ("Ben", 85)]:
    print(name, score)

Saída:

Ana 90
Ben 85

O cabeçalho desempacota cada registro à medida que ele chega. É assim também que for i, item in enumerate(values): e for a, b in zip(left, right): funcionam: cada iteração fornece um par.

Retorne vários resultados
def min_max(values):
    return min(values), max(values)

low, high = min_max([7, 2, 9])
result = min_max([7, 2, 9])
print(low, high)
print(result)

Saída:

2 9
(2, 9)

A função retorna uma tupla. O código chamador pode desempacotá-la ou manter o objeto inteiro. Por convenção, um sublinhado nomeia um valor de que o código não precisa: _, month, day = (2024, 7, 15) mantém o mês e o dia sob nomes descritivos. _ continua sendo uma variável comum, não uma operação especial de descarte.

Principais conclusões

  • O empacotamento reúne valores; o desempacotamento os atribui em ordem.
  • Nomes sem asterisco exigem uma contagem exata de itens.
  • Um nome com asterisco recebe uma lista dos itens restantes, que pode estar vazia.
  • Troque valores com a, b = b, a para preservar ambos os valores antigos.
  • Vários valores de retorno costumam ser empacotados em uma tupla.
5

Acompanhe o compartilhamento e faça cópias

Dois nomes podem se referir a uma lista, e uma lista externa copiada ainda pode compartilhar suas linhas. Essas relações explicam por que uma alteração às vezes aparece em mais de um lugar. Rastreie o objeto que um nome alcança antes de decidir se uma operação altera esse objeto ou associa o nome a outro. O mesmo raciocínio se aplica quando uma função recebe uma lista e quando um argumento padrão é reutilizado entre chamadas. A cópia oferece independência nos níveis que precisam dela.

5.1 Acompanhe nomes que compartilham uma lista

Uma variável é um nome que se refere a um objeto. A atribuição altera aquilo a que um nome se refere; ela não copia automaticamente o objeto. Com uma lista mutável, dois nomes podem, portanto, observar as mesmas alterações.

Acompanhe as referências
a = [1, 2, 3]
b = a
b.append(4)
print(a)
print(b)

Saída:

[1, 2, 3, 4]
[1, 2, 3, 4]

Há uma lista e dois nomes para ela. b é uma referência alternativa (alias) de a. A operação de acréscimo altera o objeto compartilhado, portanto lê-lo por qualquer um dos nomes mostra o item adicionado. Desenhe duas setas, uma de cada nome, para a mesma lista ao rastrear esse código.

Distinga igualdade de identidade
a = [1, 2]
b = a
c = [1, 2]
print(a == b, a == c)
print(a is b, a is c)

Saída:

True True
True False

== compara conteúdos; is testa se os objetos são o mesmo objeto. c tem conteúdo igual, mas é uma lista separada. id(x) fornece o número de identidade de um objeto, portanto id(a) == id(b) concorda com a is b. Números de identidade não informam quais itens uma lista contém.

Use == para verificar se os conteúdos são iguais. Use is para verificar compartilhamento ou um objeto especial como None. Um novo literal de lista cria uma lista separada, portanto a is [1, 2] é falso para uma lista existente a, mesmo que seus conteúdos sejam iguais.

Mutação e nova associação têm alcances diferentes
InstruçãoO que muda?O que uma referência alternativa vê?
b.append(4)Lista existenteItem adicionado
b[0] = 9Lista existenteItem substituído
b = [7, 8]O nome bLista original inalterada

Após a última instrução, b aponta para uma nova lista. a continua se referindo ao objeto original. Associar um nome a outro objeto não redireciona todos os nomes que antes se referiam a esse objeto.

Rastreie += e + separadamente

Para listas, += estende a lista existente:

a = [1]
b = a
a += [2]
print(a, b)

A saída é [1, 2] [1, 2]. Por outro lado:

a = [1]
b = a
a = a + [2]
print(a, b)

A saída é [1, 2] [1]. + cria uma nova lista, e a atribuição faz a se referir a ela. b ainda se refere à lista original de um item.

Procure referências alternativas menos visíveis

row = [0, 0] seguido de table = [row, row] armazena a mesma linha duas vezes. table[0][0] = 5 produz [[5, 0], [5, 0]] porque ambas as posições alcançam a mesma lista interna.

Números e strings não podem ser alterados no próprio objeto. Após x = 5, y = x, x += 1, y continua sendo 5; x foi associado a outro valor. As posições dos itens de uma tupla também permanecem fixas, mas uma lista interna pode mudar. Após t = ([1], 2), u = t e t[0].append(3), u mostra ([1, 3], 2): ambos os nomes ainda alcançam a mesma tupla e sua mesma lista mutável.

Principais conclusões

  • A atribuição compartilha uma referência; ela não copia uma lista.
  • == compara valores, enquanto is verifica a identidade do objeto.
  • Uma mutação é visível por referências alternativas; uma nova associação redireciona um nome.
  • Para listas, += altera o objeto, enquanto + cria uma nova lista.
  • O compartilhamento pode ocorrer dentro de uma tabela ou tupla, assim como entre nomes de variáveis.

5.2 Copie os níveis que precisam de independência

Copiar cria um novo objeto, mas a profundidade dessa cópia importa. Uma nova lista externa ainda pode conter referências às listas internas originais.

Crie uma nova lista externa
a = [1, 2, 3]
b = a.copy()
b.append(4)
print(a)
print(b)
print(a is b)

Saída:

[1, 2, 3]
[1, 2, 3, 4]
False

a[:], list(a) e a.copy() fazem uma cópia superficial de uma lista. Seu contêiner externo é novo, e suas referências aos itens são copiadas. Com números ou strings imutáveis, substituir ou adicionar um item em uma lista externa deixa a outra intacta.

Veja o que uma cópia superficial compartilha
a = [[1, 2], [3, 4]]
b = a.copy()
b[0].append(99)
print(a)
print(b is a, b[0] is a[0])

Saída:

[[1, 2, 99], [3, 4]]
False True

As duas listas externas são diferentes, mas seus primeiros itens se referem à mesma lista interna. append() altera esse objeto interno.

Substituir uma posição em b é diferente. Após b[1] = [0], b tem uma segunda linha diferente, enquanto a[1] permanece [3, 4]. A atribuição altera uma referência na lista externa de b; ela não altera a antiga segunda linha.

Copie também as listas aninhadas
import copy

a = [[1, 2], [3, 4]]
b = copy.deepcopy(a)
b[0].append(99)
print(a)
print(b)

Saída:

[[1, 2], [3, 4]]
[[1, 2, 99], [3, 4]]

import copy disponibiliza o módulo de cópia. copy.deepcopy() copia recursivamente a estrutura de listas aninhadas, portanto alterações nas listas internas copiadas não alcançam a original. Use-o quando as alterações nesses níveis internos precisarem ser independentes. Uma cópia superficial é suficiente se apenas a ordem ou as referências aos itens da lista externa forem alteradas.

Evite referências repetidas ao criar linhas
table = [[0] * 3] * 2
table[0][0] = 7
print(table)

A saída é [[7, 0, 0], [7, 0, 0]]. A multiplicação repetiu a referência a uma linha. Ela não criou duas linhas.

Crie cada linha dentro do laço:

table = []
for r in range(2):
    table.append([0] * 3)
table[0][0] = 7
print(table)

A saída é [[7, 0, 0], [0, 0, 0]]. [0] * 3 por si só é seguro para contadores independentes: inteiros não podem sofrer mutação, e a atribuição a item substitui apenas uma posição.

Escolha uma cópia por um motivo

Preservar a ordem original antes de ordenar exige uma nova lista externa. Preservar as medições aninhadas originais enquanto altera células copiadas também exige listas internas independentes. Um processamento apenas de leitura não precisa de cópia, e alterações compartilhadas intencionais podem usar referências alternativas. Para investigar um defeito em uma estrutura aninhada, verifique tanto b is a quanto b[0] is a[0]; testar apenas as listas externas não revela o compartilhamento interno.

Principais conclusões

  • A extração de fatias, list() e copy() criam uma nova lista externa.
  • Uma cópia superficial mantém referências aos itens originais.
  • Substituir uma linha copiada é diferente de alterar uma linha compartilhada.
  • copy.deepcopy copia listas aninhadas recursivamente.
  • A multiplicação de uma lista aninhada repete referências a uma linha.
  • Copie apenas os níveis cujas alterações precisam ser independentes.

5.3 Deixe claros os efeitos de uma função sobre listas

Um parâmetro de função é outro nome para o objeto fornecido pelo código chamador. Um argumento de lista não é copiado automaticamente. A função pode alterar esse objeto, associar seu parâmetro local a outro objeto ou retornar um novo resultado; essas ações afetam o código chamador de formas diferentes.

A mutação alcança o código chamador
def add_bonus(scores):
    scores.append(5)

marks = [80]
result = add_bonus(marks)
print(marks)
print(result)

Saída:

[80, 5]
None

scores e marks se referem inicialmente à mesma lista. Acrescentar um item por meio de scores altera essa lista. Como a função não tem uma instrução de retorno explícita, seu resultado é None.

Por outro lado, def reset(scores): scores = [] associa apenas o parâmetro local a outra lista. A marks do código chamador ainda se refere à lista antiga. Use scores.clear() para esvaziar essa lista compartilhada.

Mantenha uma lista retornada quando necessário

Duas formas comuns de projeto são alterar a própria lista e retornar None, ou deixá-la intacta e retornar uma nova lista:

def drop_first(values):
    del values[0]

def tail(values):
    return values[1:]

Para nums = [1, 2, 3], chamar drop_first(nums) deixa nums como [2, 3]. Escrever nums = drop_first(nums) associaria nums a None. Começando novamente com [1, 2, 3], shorter = tail(nums) atribui a shorter a lista [2, 3], enquanto nums permanece inalterada. Chamar tail(nums) sem guardar seu resultado descarta a nova lista.

Outros projetos também são úteis: sum() retorna um resumo, e pop() altera uma lista e retorna um item. Deixe o efeito e o valor de retorno claros no nome ou na docstring de uma função.

Crie um resultado sem alterar a entrada
def without_negatives(values):
    kept = []
    for value in values:
        if value >= 0:
            kept.append(value)
    return kept

original = [3, -2, 0, 7]
print(without_negatives(original))
print(original)

Saída:

[3, 0, 7]
[3, -2, 0, 7]

O código chamador também pode proteger sua lista externa passando uma cópia superficial, como drop_first(original[:]). Uma operação que edite listas internas também precisaria de cópias nesses níveis.

Evite um valor padrão mutável compartilhado
def add_item(item, basket=[]):
    basket.append(item)
    return basket

A lista padrão é criada uma vez, quando a instrução def é executada. add_item("a") retorna ['a'], e a próxima chamada com o valor padrão, add_item("b"), retorna ['a', 'b']. Use None para solicitar uma nova lista:

def add_item(item, basket=None):
    if basket is None:
        basket = []
    basket.append(item)
    return basket

Cada chamada sem um carrinho agora cria sua própria lista. Passar um carrinho existente ainda permite alterações compartilhadas intencionais. Uma função não pode alterar um número ou uma string, nem substituir as posições de uma tupla, mas pode alterar uma lista armazenada em uma tupla, por exemplo, chamando pair[0].append(9).

Principais conclusões

  • Um parâmetro se refere inicialmente ao objeto do código chamador.
  • Alterar um parâmetro de lista muda esse objeto; associar o parâmetro a outro objeto não o muda.
  • Mantenha uma nova lista retornada se o programa precisar dela.
  • Verifique tanto o efeito de uma função quanto seu valor de retorno.
  • Uma lista padrão mutável é compartilhada entre chamadas que usam o valor padrão.
  • Use None e crie uma lista dentro da função para obter um novo valor padrão.
6

Coloque sequências em ordem

Colocar registros em ordem exige duas escolhas: quais valores determinam a ordem e se a coleção original deve mudar. O Python pode ordenar a própria lista ou retornar uma nova lista a partir de qualquer iterável. Funções de chave permitem que um programa compare um campo, um valor calculado ou vários campos em sequência. Chaves iguais preservam sua ordem de entrada, o que torna os empates previsíveis e permite ordenar por mais de uma regra.

6.1 Escolha como ordenar ou inverter dados

Ordenar coloca itens em ordem de comparação. Inverter troca o sentido de sua ordem atual. Decida também se o programa deve alterar a lista existente ou mantê-la e receber uma nova lista.

Ordene a própria lista ou mantenha uma nova lista
nums = [3, 1, 2]
new = sorted(nums)
print(nums)
print(new)
nums.sort()
print(nums)

Saída:

[3, 1, 2]
[1, 2, 3]
[1, 2, 3]

sorted() cria uma nova lista. sort() é um método de lista que reorganiza a lista existente e retorna None. nums = nums.sort() faz o nome perder a referência à lista e o associa a None. Escreva nums.sort() em uma linha própria ou use nums = sorted(nums). print(nums.sort()) imprime None embora a lista tenha sido reordenada.

sorted() aceita qualquer iterável e sempre retorna uma lista. sorted((3, 1, 2)) produz [1, 2, 3], e sorted("cab") produz ['a', 'b', 'c']. Strings e tuplas não têm um método sort() que altere o próprio objeto.

Ordem decrescente e ordem invertida
Expressão para nums = [3, 1, 2]ResultadoAltera nums?
sorted(nums, reverse=True)[3, 2, 1]Não
nums.sort(reverse=True)Retorna None; a lista se torna [3, 2, 1]Sim
nums[::-1][2, 1, 3]Não
list(reversed(nums))[2, 1, 3]Não
nums.reverse()Retorna None; a lista se torna [2, 1, 3]Sim

Cada linha começa com a lista original. reverse=True solicita uma ordem de comparação decrescente e deve ser informado pelo nome; sorted(nums, True) lança TypeError. Inverter simplesmente percorre as posições existentes para trás, portanto não produz necessariamente valores em ordem decrescente.

Verifique os valores comparados

Números são ordenados pelo valor numérico, inclusive com inteiros e números de ponto flutuante misturados: sorted([2.5, -1, 2]) produz [-1, 2, 2.5].

O texto é comparado caractere por caractere. sorted(["10", "9", "100"]) produz ['10', '100', '9']. O primeiro caractere '1' é ordenado antes de '9', e um prefixo de string vem antes de uma string mais longa que começa com ele. Converta strings numéricas com int() ou float() quando quiser uma ordenação numérica.

As letras maiúsculas A–Z são ordenadas antes das minúsculas a–z. sorted(["b", "B", "a"]) produz ['B', 'a', 'b']. A ordem padrão de strings se baseia em códigos de caracteres; ela não é uma ordem de dicionário que ignora maiúsculas e minúsculas.

Todos os itens comparados devem aceitar < entre si. sorted([3, "two", 1]) lança TypeError. Limpe ou converta os dados antes de ordenar.

Use posições ordenadas

Para um número ímpar de notas, a ordenação facilita a leitura do valor do meio:

scores = [72, 95, 64, 88, 79]
ordered = sorted(scores)
median = ordered[len(ordered) // 2]
print(ordered)
print(median)

A saída é [64, 72, 79, 88, 95] seguida de 79. A lista original ainda registra a ordem em que as notas chegaram. Esse cálculo com um único item do meio se aplica a listas não vazias de tamanho ímpar.

Principais conclusões

  • sort altera uma lista e retorna None; sorted retorna uma nova lista.
  • sorted aceita iteráveis como tuplas e strings.
  • reverse=True ordena em ordem decrescente; inverter apenas troca o sentido das posições atuais.
  • Strings numéricas usam a ordem de texto, a menos que sejam convertidas.
  • Os itens devem aceitar comparação entre si.

6.2 Ordene registros pelos campos relevantes

Uma função de chave calcula o valor de comparação para cada item. Os itens originais permanecem intactos no resultado ordenado. Isso permite que um programa ordene texto pelo tamanho ou registros por um campo selecionado.

Passe uma função, não uma chamada de função
words = ["kiwi", "fig", "banana"]
print(sorted(words, key=len))

Saída:

['fig', 'kiwi', 'banana']

O Python chama len uma vez para cada item e compara os tamanhos resultantes, 4, 3 e 6. Passe key=len, sem parênteses. key=len() tenta chamar len imediatamente sem argumento e falha.

Para comparar em minúsculas, use key=str.lower. Com ["banana", "apple", "Cherry"], a ordem padrão é ['Cherry', 'apple', 'banana']. Com key=str.lower, o resultado é ['apple', 'banana', 'Cherry']. O C maiúsculo original permanece no resultado; apenas as chaves de comparação estão em minúsculas.

Selecione um campo do registro
results = [("Ana", 90), ("Ben", 72), ("Cy", 85)]

def by_score(record):
    return record[1]

print(sorted(results, key=by_score))

Saída:

[('Ben', 72), ('Cy', 85), ('Ana', 90)]

A função recebe um registro por vez. record[1] seleciona sua nota. Adicione reverse=True para colocar a maior nota primeiro. results.sort(key=by_score, reverse=True) usa a mesma regra, mas altera a própria results.

key=by_score(results) é diferente: ele chama a função para a lista inteira e passa seu resultado como argumento de chave. Aqui esse resultado é a tupla ('Ben', 72), que não pode ser chamada como função, portanto a ordenação lança TypeError.

Use vários campos

Sem uma chave, tuplas comparam seus primeiros itens e depois os segundos para desempatar primeiros itens iguais. Ordenar [("Ben", 72), ("Ana", 90), ("Ana", 85)] produz [('Ana', 85), ('Ana', 90), ('Ben', 72)].

Uma chave pode retornar uma tupla para escolher uma ordem de campos diferente:

def rank_key(record):
    return (-record[1], record[0])

results = [("Dee", 85), ("Ana", 90), ("Cy", 85)]
print(sorted(results, key=rank_key))

Saída:

[('Ana', 90), ('Cy', 85), ('Dee', 85)]

Negar a nota faz com que notas maiores tenham chaves menores. Os nomes então desempatarão as notas em ordem crescente. reverse=True em uma chave positiva (score, name) inverteria ambos os campos, incluindo os nomes, portanto não atenderia a essa regra com sentidos diferentes.

Mantenha em ordem itens com chaves iguais

A ordenação do Python é estável: itens com chaves iguais mantêm sua ordem de entrada. Ordenar ["bb", "a", "cc", "d"] por len produz ['a', 'd', 'bb', 'cc']. O empate entre as duas palavras de uma letra mantém 'a' primeiro; o empate entre as de duas letras mantém 'bb' primeiro. A estabilidade também permite ordenar primeiro por um campo secundário e depois pelo campo principal.

min() e max() também aceitam funções de chave. max(words, key=len) retorna 'banana', não seu tamanho. Quando as chaves empatam, essas funções retornam o primeiro item correspondente encontrado.

Principais conclusões

  • Uma função de chave associa um item ao seu valor de comparação.
  • Passe a própria função, como key=len ou key=by_score.
  • Os resultados das chaves controlam a ordenação sem substituir os itens originais.
  • Uma chave em tupla ordena pelo primeiro campo e depois usa os campos seguintes para desempatar.
  • Negar uma chave numérica pode inverter apenas o sentido desse campo.
  • A ordenação estável preserva a ordem de entrada entre chaves iguais.
  • min e max retornam itens originais e escolhem o primeiro em caso de empate de chaves.

Exercícios resolvidos de Listas e tuplas em Python

6 Lições Interativas

1

Leia as contagens de entregas de uma semana

13 passos
Crie uma lista, selecione dias e calcule uma média com segurança.
  1. 1
    IntroduçãoMantenha as contagens em ordem

    Um registro de entregas armazena uma contagem por dia. Uma lista mantém a ordem, portanto uma posição identifica um dia e uma fatia seleciona vários dias. Você pode então calcular um total ou uma média dos valores selecionados.

    Trabalhe com deliveries = [12, 7, 15, 9, 17]. Essas são cinco contagens diárias em ordem de chegada. Acompanhe primeiro as posições, depois os limites das fatias e, por fim, o tipo de resultado produzido por cada operação.

  2. 2
    ExemploAssocie contagens a posições

    As cinco contagens ocupam os índices de 0 a 4:

    deliveries = [12, 7, 15, 9, 17]
    print(deliveries[0], deliveries[4])
    

    A saída é 12 17. len(deliveries) é 5, mas o índice 5 não existe. Uma contagem informa quantas posições existem; ela não nomeia a última. A contagem final também pode ser lida como deliveries[-1], usando um índice negativo a partir do fim.

  3. 3
    DicaVerifique uma contagem antes de usá-la

    O pertencimento responde a uma pergunta diferente da indexação:

    print(9 in deliveries)
    print(4 in deliveries)
    

    A saída é True e depois False. O valor 9 aparece, mas 4 não, embora 4 seja um índice válido. in verifica os valores armazenados. Se você quiser a contagem na posição 4, use deliveries[4], que retorna 17.

  4. 4
    DesafioEncontre a penúltima contagem

    O que deliveries[-2] retorna, e deliveries[len(deliveries)] funcionaria?

    ---reveal---

    O índice negativo -2 seleciona 9, uma posição antes do último item 17. A segunda expressão tenta acessar o índice 5 e lança IndexError. Use len(deliveries) - 1 ou -1 para selecionar o último item; o número de itens está uma posição além do índice não negativo final.

  5. 5
    ExemploSelecione os três dias do meio

    Use o índice 1 como início e o índice 4 como limite de parada excluído:

    middle = deliveries[1:4]
    print(middle)
    

    A saída é [7, 15, 9]. As posições selecionadas são 1, 2 e 3. A posição 4 contém 17, mas aqui marca o limite de parada. middle é uma nova lista, portanto alterar suas posições externas não substituirá uma posição em deliveries.

  6. 6
    ExplicaçãoOmita um limite

    deliveries[:2] produz [12, 7], os dois primeiros dias. deliveries[2:] produz [15, 9, 17], todos os dias restantes. Ambas as fatias se encontram no limite 2, portanto uni-las reconstrói o conteúdo original.

    deliveries[-2:] produz [9, 17]. Um limite negativo conta a partir do fim. deliveries[20:] é []: um limite de fatia fora do intervalo é ajustado à extremidade, ao contrário de uma consulta de item fora do intervalo.

  7. 7
    ExemploPercorra dias alternados

    Um terceiro campo da fatia controla o espaçamento:

    print(deliveries[::2])
    print(deliveries[::-1])
    

    A saída é [12, 15, 17] e depois [17, 9, 15, 7, 12]. O passo 2 visita os índices 0, 2 e 4. O passo -1 visita cada item para trás. Ambos os resultados são novas listas. Um passo zero não pode avançar e lança ValueError.

  8. 8
    DesafioDistinga uma contagem de uma lista

    Quais são os valores e tipos de deliveries[2] e deliveries[2:3]?

    ---reveal---

    deliveries[2] é o inteiro 15. deliveries[2:3] é a lista [15]. A fatia seleciona uma posição, mas ainda retorna uma lista. Essa diferença importa se a próxima operação espera uma contagem numérica: adicionar 1 ao inteiro funciona, enquanto adicionar 1 diretamente à lista lança TypeError.

  9. 9
    ExemploCalcule uma média a partir da fatia

    A fatia do meio é [7, 15, 9]. Some seus itens e divida pelo seu tamanho:

    total = sum(middle)
    mean = total / len(middle)
    print(total)
    print(mean)
    

    A saída é 31 e depois 10.333333333333334. O total é 7 + 15 + 9, e o divisor é 3. / produz um resultado de ponto flutuante, portanto essa média é exibida com uma aproximação decimal.

  10. 10
    Ideia-chaveTrate uma seleção sem dias

    Uma fatia pode estar vazia, portanto uma média precisa de uma verificação de proteção:

    selected = deliveries[20:]
    if selected:
        print(sum(selected) / len(selected))
    else:
        print("No days selected")
    

    Isso imprime No days selected. Listas vazias são consideradas falsas. Embora sum([]) seja 0, dividir esse total por len([]) causaria uma divisão por zero. min e max também falham com essas entradas vazias.

  11. 11
    ConexãoCrie uma linha para exibição

    Uma exibição precisa de strings, não de uma lista de inteiros:

    pieces = []
    for count in deliveries:
        pieces.append(str(count))
    print(", ".join(pieces))
    

    A saída é 12, 7, 15, 9, 17. join é chamado sobre o separador e o coloca entre os itens. Passar a lista numérica diretamente falharia porque cada item unido deve ser uma string. split faz o caminho inverso, dividindo texto em partes que são strings.

  12. 12
    DesafioSelecione, some e mantenha a original

    O que este código imprime?

    selected = deliveries[-3:]
    selected[0] = 0
    print(sum(selected), deliveries[2])
    

    ---reveal---

    Ele imprime 26 15. A fatia começa como [15, 9, 17], depois sua primeira posição é substituída, formando [0, 9, 17]. Esses valores totalizam 26. A lista externa da fatia é separada, portanto a contagem original em deliveries[2] permanece 15.

  13. 13
    RecapitulaçãoEscolha o resultado de que você precisa

    Leia uma posição para obter uma contagem individual, use uma fatia para uma sequência e use funções de resumo para totais ou extremos. Uma fatia de lista cria uma nova lista externa.

    Antes de calcular a média de uma seleção, trate o caso em que ela está vazia. Ao criar texto para exibição, converta valores numéricos em strings antes de juntá-los.

2

Edite uma solicitação de materiais

10 passos
Adicione, remova, encontre e substitua itens enquanto acompanha os resultados dos métodos.

Salve esta aula para seguir cada Lição Interativa passo a passo.

  1. 1
    IntroduçãoAcompanhe a lista e o valor retornado
  2. 2
    ExemploAdicione um lote de itens
  3. 3
    ExemploColoque um item no início
  4. 4
    ExemploRemova e salve um item recolhido
  5. 5
    DesafioEscolha uma remoção por valor
  6. 6
    ExemploEncontre a posição de uma correção
  7. 7
    ExemploSubstitua um item por um lote
  8. 8
    DesafioExclua um intervalo e encontre um valor
  9. 9
    DesafioFinalize a solicitação sem perdê-la
  10. 10
    RecapitulaçãoAssocie a alteração à operação
3

Limpe medições e some uma tabela

13 passos
Escolha formas de laço, crie um resultado e processe linhas de tamanhos diferentes.

Salve esta aula para seguir cada Lição Interativa passo a passo.

  1. 1
    IntroduçãoDecida o que cada laço mantém
  2. 2
    ExplicaçãoLeia um valor sem editar sua posição
  3. 3
    ExemploSubstitua medições inválidas pelo índice
  4. 4
    ConexãoAssocie rótulos a medições
  5. 5
    DesafioExplique um item ignorado
  6. 6
    ExemploConte as medições positivas
  7. 7
    ExemploCrie um resultado filtrado e transformado
  8. 8
    DicaBusque até a primeira correspondência
  9. 9
    DesafioEscolha um máximo válido
  10. 10
    ExemploSelecione uma linha e uma célula
  11. 11
    ExemploSome todas as linhas
  12. 12
    DesafioFiltre toda a tabela
  13. 13
    RecapitulaçãoSepare a preparação do trabalho repetido
4

Use um registro fixo e desempacote seus campos

10 passos
Acompanhe posições de tuplas, desempacotamento com asterisco, trocas e pares retornados.

Salve esta aula para seguir cada Lição Interativa passo a passo.

  1. 1
    IntroduçãoMantenha um registro reunido
  2. 2
    ExemploCrie o registro da estação
  3. 3
    Ideia-chaveTeste o limite da imutabilidade
  4. 4
    DesafioCrie uma tupla de um item
  5. 5
    ExemploDê um nome a cada campo
  6. 6
    ExemploMantenha a primeira medição e as restantes
  7. 7
    DesafioTroque valores de coordenadas
  8. 8
    ExemploRetorne um par de extremos
  9. 9
    DesafioLeia e desempacote um campo selecionado
  10. 10
    RecapitulaçãoLeia a estrutura antes de desempacotar
5

Rastreie uma tabela copiada por meio de uma função

14 passos
Distinga referências alternativas, cópias superficiais, cópias profundas e alterações em parâmetros locais.

Salve esta aula para seguir cada Lição Interativa passo a passo.

  1. 1
    IntroduçãoDesenhe caminhos até os objetos
  2. 2
    ExemploCrie uma referência alternativa
  3. 3
    ExemploRedirecione um nome
  4. 4
    DesafioPreveja dois tipos de adição
  5. 5
    ExemploCopie a tabela externa
  6. 6
    ExemploAltere uma linha compartilhada
  7. 7
    Ideia-chaveSubstitua uma linha copiada
  8. 8
    DesafioEscolha uma cópia mais profunda
  9. 9
    ExemploAltere por meio de um parâmetro
  10. 10
    ConexãoRetorne uma lista separada
  11. 11
    ExplicaçãoEvite uma lista padrão persistente
  12. 12
    DesafioDistinga a nova associação local da limpeza
  13. 13
    DesafioRastreie uma cópia superficial passada a uma função
  14. 14
    RecapitulaçãoRastreie o nível que está sendo alterado
6

Classifique registros sem perder sua ordem de chegada

13 passos
Ordene uma cópia, selecione chaves, desfaça empates e mantenha a ordem de chaves iguais.

Salve esta aula para seguir cada Lição Interativa passo a passo.

  1. 1
    IntroduçãoSepare dados armazenados de chaves de comparação
  2. 2
    ExemploMantenha a ordem de chegada
  3. 3
    ExemploCompare inversão com ordenação decrescente
  4. 4
    DicaVerifique o tipo da entrada
  5. 5
    DesafioAcompanhe o resultado de uma ordenação
  6. 6
    ExemploEscolha uma chave de nota
  7. 7
    Ideia-chaveMantenha registros empatados na ordem de chegada
  8. 8
    DesafioPasse um objeto chamável
  9. 9
    ExemploAdicione um critério de desempate alfabético
  10. 10
    DicaInverta apenas o sentido numérico
  11. 11
    ConexãoSelecione um item por uma chave extrema
  12. 12
    DesafioMantenha registros e nomes em suas formas originais
  13. 13
    RecapitulaçãoEscolha o efeito e a regra

Questões de Listas e tuplas em Python

60 Questões de Prática em 6 conjuntos

Conjunto 1: Leia, extraia fatias e altere sequências10 Questões de Prática

Questão 1 de 10

Para levels = [14, 29, 37, 52], quanto é levels[-2]?
  1. 29
  2. 52
  3. 37
  4. 14
Mostrar respostaOcultar resposta
Resposta: C
Um índice negativo conta a partir do fim: -1 seleciona 52, e -2 seleciona 37. Contar duas posições a partir do início produziria 29, mas usaria outro sentido. O sinal de menos altera onde começa a contagem de posições.

Questão 2 de 10

Para codes = [2, 5, 8, 11, 14, 17], quanto é codes[1:5:2]?
  1. [5, 11]
  2. [5, 8, 11, 14]
  3. [5, 11, 17]
  4. [2, 8, 14]
Mostrar respostaOcultar resposta
Resposta: A
A fatia começa no índice 1 e visita o índice 3 em seguida porque seu passo é 2. Ela para antes do índice 5, portanto o resultado é [5, 11]. Incluir 17 trataria o limite de parada como incluído; selecionar cada item entre os limites ignoraria o passo.

Questão 3 de 10

Qual lista resulta deste código?

items = ["pen"]
items.append(["clip", "pad"])
  1. ['pen', 'clip', 'pad']
  2. [['pen'], ['clip', 'pad']]
  3. ['pen', 'clip pad']
  4. ['pen', ['clip', 'pad']]
Mostrar respostaOcultar resposta
Resposta: D
append adiciona seu argumento como um item, portanto as duas strings permanecem juntas dentro de uma lista aninhada. A lista externa agora tem dois itens: uma string e uma lista. Adicionar as strings como itens externos separados exigiria extend com a lista de dois itens.

Questão 4 de 10

O que este código imprime?

parts = "6|12|18".split("|")
print(len(parts), parts[1])
  1. 8 12
  2. 3 12
  3. 3 6
  4. 8 |
Mostrar respostaOcultar resposta
Resposta: B
Dividir nos dois separadores cria três itens de string: '6', '12' e '18'. O índice 1 seleciona o segundo item, que é impresso como 12. Contar os caracteres da string original confundiria o texto de entrada com a lista retornada por split.

Questão 5 de 10

Quanto é len(values) após este código?

values = [4, 7, 10, 13]
values[1:3] = [20, 21, 22]
  1. 4
  2. 5
  3. 6
  4. 3
Mostrar respostaOcultar resposta
Resposta: B
A fatia seleciona dois itens existentes, nos índices 1 e 2, e os substitui por três itens. O novo tamanho é 4 - 2 + 3, que é 5. Manter o tamanho original seria correto para uma atribuição a um item, mas uma substituição de fatia contígua pode aumentar ou diminuir uma lista.

Questão 6 de 10

Como você escreve uma tupla que contém apenas o inteiro 12?
  1. (12)
  2. [12]
  3. tuple(12)
  4. (12,)
Mostrar respostaOcultar resposta
Resposta: D
Uma tupla de um item precisa de uma vírgula final, portanto (12,) é o valor necessário. Parênteses sozinhos apenas agrupam o inteiro, fazendo (12) ser o mesmo inteiro que 12. Colchetes criam uma lista, e tuple(12) falha porque um inteiro não pode fornecer itens iteráveis.

Questão 7 de 10

O que este código imprime?

queue = [18, 0, 24]
removed = queue.pop(0)
print(removed, queue)
  1. 18 [0, 24]
  2. 0 [18, 24]
  3. None [0, 24]
  4. 24 [18, 0]
Mostrar respostaOcultar resposta
Resposta: A
pop(0) seleciona a posição 0, remove seu item 18 e retorna esse item. A lista restante é [0, 24]. Remover o valor 0 produziria [18, 24], mas é isso que remove(0) faz; pop interpreta seu argumento como um índice.

Questão 8 de 10

O que este código imprime?

a = [3, 6, 9, 12, 15]
b = a[-4:-1]
print(b[::-1][1])
  1. 6
  2. 12
  3. 9
  4. 15
Mostrar respostaOcultar resposta
Resposta: C
A primeira fatia seleciona os índices de 1 a 3, produzindo [6, 9, 12]. Inverter essa nova lista produz [12, 9, 6], cujo índice 1 é 9. Selecionar 6 leria o primeiro item da fatia original sem completar a inversão e a consulta final.

Questão 9 de 10

Para items = [9, 16, 25], o que acontece quando o Python avalia items[len(items)]?
  1. Lança IndexError.
  2. Retorna o último item, 25.
  3. Retorna o primeiro item, 9.
  4. Lança TypeError.
Mostrar respostaOcultar resposta
Resposta: A
len(items) é 3, mas os índices não negativos válidos são 0, 1 e 2. Consultar o índice 3 lança IndexError porque não existe item nessa posição. A expressão fornece um índice inteiro, portanto o problema é seu intervalo, não seu tipo; items[-1] retornaria 25.

Questão 10 de 10

O que esta comparação produz: [4, 99] < [5, 1]?
  1. False, porque o segundo par é 99 e 1.
  2. False, porque a primeira lista tem o maior total.
  3. True, porque ambas as listas têm o mesmo tamanho.
  4. True, porque o primeiro par diferente é 4 e 5.
Mostrar respostaOcultar resposta
Resposta: D
A ordenação de sequências compara posições correspondentes da esquerda para a direita. O primeiro par já é diferente, e 4 < 5 é verdadeiro, portanto a comparação termina ali. O 99 posterior não muda esse resultado; o Python não compara os totais das listas nessa operação.
Conjunto 2: Processe valores, posições e tabelas10 Questões de Prática

Salve esta aula para ver todas as respostas e praticar cada conjunto.

Questão 1 de 10

Qual lista este código imprime?

values = [8, 3]
for value in values:
    value = 0
print(values)
  1. [0, 0]
  2. [8, 3]
  3. [0, 3]
  4. [8, 0]
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 2 de 10

Qual valor este código imprime?

count = 0
for size in [10, 7, 10, 13, 6]:
    if size >= 10:
        count += 1
print(count)
  1. 1
  2. 33
  3. 2
  4. 3
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 3 de 10

Para table = [[6, 8, 10], [11, 13, 15]], o que table[1][0] + table[0][2] produz?
  1. 21
  2. 19
  3. 25
  4. 23
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 4 de 10

Quantos pares list(zip(["Lee", "Mo", "Nia"], [41, 56])) contém?
  1. 3
  2. 5
  3. 2
  4. 1
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 5 de 10

O que é impresso?

values = [7, -4, -8, 2]
position = -1
for i, value in enumerate(values):
    if value < 0:
        position = i
        break
print(position, values[position])
  1. 2 -8
  2. -1 2
  3. -4 1
  4. 1 -4
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 6 de 10

Quantas vezes total += value é executado?

total = 0
for row in [[2, 4], [6], [8, 10, 12]]:
    for value in row:
        total += value
  1. 3
  2. 6
  3. 9
  4. 2
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 7 de 10

Qual lista permanece após este código?

values = [0, 0, 1, 0]
for value in values:
    if value == 0:
        values.remove(value)
  1. [1]
  2. [0, 0, 1]
  3. [1, 0]
  4. [0, 1]
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 8 de 10

Um laço deve encontrar o maior valor na lista não vazia [-14, -6, -19]. Com o que seu máximo acumulado deve ser inicializado?
  1. O primeiro item, -14.
  2. O número zero, 0.
  3. O tamanho da lista, 3.
  4. O primeiro índice, 0.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 9 de 10

O que este código imprime?

kept = []
for text in ["4", "15", "8", "21"]:
    number = int(text)
    if number % 2 == 0:
        kept.append(number + 1)
print(kept)
  1. [4, 8]
  2. [5, 9]
  3. [5, 16, 9, 22]
  4. [16, 22]
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 10 de 10

Qual tabela resulta?

table = []
for r in range(2):
    table.append([0] * 2)
table[1][0] = 6
  1. [[6, 0], [6, 0]]
  2. [[0, 6], [0, 0]]
  3. [[0, 0], [6, 0]]
  4. [[0, 0], [0, 6]]
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Conjunto 3: Desempacote registros e rastreie objetos compartilhados10 Questões de Prática

Salve esta aula para ver todas as respostas e praticar cada conjunto.

Questão 1 de 10

Após label, amount = ("rice", 4), qual valor amount contém?
  1. 'rice'
  2. (4,)
  3. ('rice', 4)
  4. 4
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 2 de 10

Quanto é middle após first, *middle, last = (2, 5, 8, 11, 14)?
  1. (5, 8, 11)
  2. [5, 8, 11]
  3. [2, 5, 8, 11]
  4. [5, 8, 11, 14]
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 3 de 10

O que este código imprime?

a = [5, 8]
b = [5, 8]
print(a == b, a is b)
  1. True True
  2. False True
  3. True False
  4. False False
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 4 de 10

O que este código imprime?

record = ([2], "ready")
other = record
record[0].append(7)
print(other)
  1. ([2, 7], 'ready')
  2. ([2], 'ready')
  3. ([7], 'ready')
  4. ([2], 'ready', 7)
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 5 de 10

O que este código imprime?

a = [4]
b = a
a += [9]
a = a + [12]
print(a, b)
  1. [4, 9, 12] [4]
  2. [4, 9, 12] [4, 9, 12]
  3. [4, 9, 12] [4, 9]
  4. [4, 9] [4, 9, 12]
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 6 de 10

O que este código imprime?

def bounds(values):
    return min(values), max(values)

low, high = bounds([18, 5, 12])
low, high = high, low
print(low, high)
  1. 18 5
  2. 5 18
  3. 18 18
  4. 5 5
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 7 de 10

O que este código imprime?

a = [2, 6]
b = a.copy()
b[0] = 10
print(a, b)
  1. [10, 6] [10, 6]
  2. [2, 6] [2, 6]
  3. [10, 6] [2, 6]
  4. [2, 6] [10, 6]
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 8 de 10

Um programa precisa de uma chave de dicionário que represente a linha 3 e a coluna 7. Qual valor ele pode usar como chave de coordenada?
  1. [3, 7]
  2. (3, 7)
  3. ([3], 7)
  4. (3, [7])
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 9 de 10

O que este código imprime?

a = [[4], [8]]
b = a.copy()
b[0].append(6)
b[1] = [9]
print(a)
  1. [[4], [8]]
  2. [[4, 6], [9]]
  3. [[4], [9]]
  4. [[4, 6], [8]]
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 10 de 10

O que este código imprime?

row = [1, 2]
table = [row, row]
row = [8, 9]
table[0][1] = 7
print(table, row)
  1. [[1, 7], [1, 7]] [8, 9]
  2. [[8, 7], [8, 7]] [8, 7]
  3. [[1, 7], [1, 2]] [8, 9]
  4. [[1, 2], [1, 2]] [8, 7]
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Conjunto 4: Controle alterações entre chamadas de funções10 Questões de Prática

Salve esta aula para ver todas as respostas e praticar cada conjunto.

Questão 1 de 10

Para tags = ["new", "old", "new"], o que tags.count("done") retorna?
  1. 0
  2. -1
  3. None
  4. ValueError
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 2 de 10

O que este código imprime?

def reset(values):
    values = []

values = [11, 22]
reset(values)
print(values)
  1. []
  2. None
  3. [11, 22]
  4. [0, 0]
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 3 de 10

O que este código imprime?

import copy
a = [[3], [7]]
b = copy.deepcopy(a)
b[0].append(5)
print(a, b[0] is a[0])
  1. [[3, 5], [7]] True
  2. [[3], [7]] False
  3. [[3], [7]] True
  4. [[3, 5], [7]] False
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 4 de 10

O que a última linha imprime?

def collect(item, items=[]):
    items.append(item)
    return items

first = collect("x")
second = collect("y")
print(first is second, first)
  1. False ['x']
  2. True ['x']
  3. False ['x', 'y']
  4. True ['x', 'y']
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 5 de 10

O que este código imprime?

def trim(values):
    del values[0]

items = [6, 9, 12]
result = trim(items)
print(items, result)
  1. [9, 12] None
  2. [6, 9, 12] [9, 12]
  3. [9, 12] [9, 12]
  4. None [9, 12]
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 6 de 10

O que este código imprime?

def change(values):
    values.append(8)
    values = [0]
    return values

original = [3]
result = change(original)
print(original, result)
  1. [0] [0]
  2. [3, 8] [0]
  3. [3] [0]
  4. [3, 8] [3, 8]
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 7 de 10

Qual tabela resulta?

table = [[0] * 2] * 3
table[2][1] = 4
table[0] = [9, 9]
  1. [[9, 9], [0, 0], [0, 4]]
  2. [[9, 9], [9, 9], [9, 9]]
  3. [[0, 4], [0, 4], [0, 4]]
  4. [[9, 9], [0, 4], [0, 4]]
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 8 de 10

Para codes = ["q", "r", "q", "s", "q"], quanto é codes.index("q", 1)?
  1. 0
  2. 1
  3. 2
  4. 4
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 9 de 10

O que é impresso?

def add(item, values=None):
    if values is None:
        values = []
    values.append(item)
    return values

a = add(4)
b = add(7)
c = add(9, a)
print(a, b, c is a)
  1. [4, 7, 9] [4, 7, 9] True
  2. [4] [7] False
  3. [4, 9] [7] True
  4. [4, 9] [7, 9] False
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 10 de 10

O que este código imprime?

def edit(rows):
    rows[0].append(5)
    rows.append([9])

original = [[1], [2]]
edit(original[:])
print(original)
  1. [[1], [2]]
  2. [[1, 5], [2]]
  3. [[1, 5], [2], [9]]
  4. [[1], [2], [9]]
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Conjunto 5: Escolha regras de ordenação e desfaça empates10 Questões de Prática

Salve esta aula para ver todas as respostas e praticar cada conjunto.

Questão 1 de 10

Qual valor result contém após nums = [8, 2, 5] e result = nums.sort()?
  1. [2, 5, 8]
  2. [8, 5, 2]
  3. None
  4. [8, 2, 5]
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 2 de 10

O que sorted(["20", "3", "11"]) retorna?
  1. ['3', '11', '20']
  2. ['20', '3', '11']
  3. ['3', '20', '11']
  4. ['11', '20', '3']
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 3 de 10

O que sorted(["pear", "a", "plum", "to"], key=len) retorna?
  1. ['a', 'to', 'plum', 'pear']
  2. ['a', 'to', 'pear', 'plum']
  3. ['a', 'pear', 'plum', 'to']
  4. ['pear', 'plum', 'to', 'a']
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 4 de 10

Para values = [6, 1, 4], qual par de resultados vem de values[::-1] e sorted(values, reverse=True), nessa ordem?
  1. [4, 1, 6] e [6, 4, 1]
  2. [6, 4, 1] e [4, 1, 6]
  3. [4, 1, 6] e [4, 1, 6]
  4. [6, 4, 1] e [6, 4, 1]
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 5 de 10

Os registros são pares (name, score). Qual corpo de função de chave coloca as notas maiores primeiro e os nomes de A a Z quando as notas empatam?
  1. return (record[1], record[0])
  2. return (record[0], -record[1])
  3. return (-record[1], len(record[0]))
  4. return (-record[1], record[0])
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 6 de 10

Qual ordem este código produz?

records = [("Zoe", 8), ("Ali", 8), ("Mia", 6)]
def by_score(record):
    return record[1]
print(sorted(records, key=by_score, reverse=True))
  1. [('Ali', 8), ('Zoe', 8), ('Mia', 6)]
  2. [('Mia', 6), ('Zoe', 8), ('Ali', 8)]
  3. [('Zoe', 8), ('Ali', 8), ('Mia', 6)]
  4. [('Zoe', 8), ('Mia', 6), ('Ali', 8)]
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 7 de 10

O que este código imprime?

words = ["oak", "elm", "pine", "ash"]
print(max(words, key=len), min(words, key=len))
  1. pine oak
  2. pine ash
  3. 4 3
  4. pine elm
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 8 de 10

O que este código imprime?

words = ["beta", "Alpha", "alpha", "Beta"]
print(sorted(words, key=str.lower))
  1. ['beta', 'Beta', 'Alpha', 'alpha']
  2. ['Alpha', 'alpha', 'beta', 'Beta']
  3. ['Alpha', 'beta', 'alpha', 'Beta']
  4. ['Alpha', 'Beta', 'beta', 'alpha']
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 9 de 10

O que este código imprime?

a = [9, 4, 7]
b = a
c = sorted(a)
a.reverse()
print(b, c)
  1. [7, 4, 9] [4, 7, 9]
  2. [4, 7, 9] [4, 7, 9]
  3. [9, 4, 7] [4, 7, 9]
  4. [7, 4, 9] [9, 7, 4]
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 10 de 10

Um programa primeiro ordena registros (name, score) pelo nome de A a Z. Em seguida, ordena-os de forma estável por nota, da maior para a menor. Como os registros com notas iguais ficam ordenados na lista final?
  1. Pelo nome de Z a A dentro de cada grupo de notas iguais.
  2. Pelo nome de A a Z antes de qualquer comparação de notas.
  3. Pela ordem anterior às duas ordenações.
  4. Pelo nome de A a Z dentro de cada grupo de notas iguais.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Conjunto 6: Depure e combine operações com sequências10 Questões de Prática

Salve esta aula para ver todas as respostas e praticar cada conjunto.

Questão 1 de 10

Para values = [12, 24], quanto é values[5:20]?
  1. IndexError
  2. []
  3. [24]
  4. [12, 24]
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 2 de 10

Uma lista numérica pode estar vazia. Como uma função pode retornar sua média quando há valores e None caso contrário?
  1. Teste if not values: return None e depois retorne sum(values) / len(values).
  2. Teste if not values: return 0 e depois retorne sum(values) / len(values).
  3. Retorne sum(values) / len(values) antes de testar se ela está vazia.
  4. Teste if values: return None e depois retorne sum(values) / len(values).
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 3 de 10

O que este código imprime?

items = [1, 2]
result = items.extend([3, 4])
print(len(items), result)
  1. 3 None
  2. 4 [1, 2, 3, 4]
  3. 2 [3, 4]
  4. 4 None
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 4 de 10

O que este código imprime?

records = [("A", 4), ("B", 9)]
amounts = []
for _, amount in records:
    amounts.append(amount)
first, *rest = amounts[::-1]
print(first, rest)
  1. 4 [9]
  2. 9 (4,)
  3. 9 [4]
  4. [9] 4
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 5 de 10

O que este código imprime?

values = [5, -2, 8, -4]
for i, value in enumerate(values):
    if value < 0:
        values[i] = -value
print(values[1::2])
  1. [2, 4]
  2. [-2, -4]
  3. [5, 8]
  4. [5, 2, 8, 4]
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 6 de 10

O que este código imprime?

a = [[9, 2], [8, 1]]
b = a[:]
b.reverse()
b[0][0] = 6
print(a)
  1. [[6, 1], [9, 2]]
  2. [[9, 2], [8, 1]]
  3. [[9, 2], [6, 1]]
  4. [[6, 2], [8, 1]]
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 7 de 10

O que este código imprime?

records = [("Rae", 7), ("Dev", 9), ("Cam", 7)]
def rank(record):
    return (-record[1], record[0])
ordered = sorted(records, key=rank)
name, score = ordered[1]
print(name, score)
  1. Rae 7
  2. Cam 7
  3. Dev 9
  4. Cam -7
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 8 de 10

O que este código imprime?

def select(values):
    kept = []
    for value in values:
        if value >= 5:
            kept.append(value * 2)
    return kept

a = [3, 5, 8]
b = select(a)
b.pop(0)
print(a, b)
  1. [3, 5, 8] [10, 16]
  2. [5, 8] [16]
  3. [3, 5, 8] [10]
  4. [3, 5, 8] [16]
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 9 de 10

Uma lista não vazia de tamanho ímpar é [31, 12, 27, 18, 24, 15, 21]. Após ordenar uma cópia, qual é o valor do meio?
  1. 18
  2. 21
  3. 24
  4. 27
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 10 de 10

O que este código imprime?

point = (6, 8)
old = point
point = (10,) + point[1:]
print(old, point)
  1. (6, 8) (10, 8)
  2. (10, 8) (10, 8)
  3. (6, 8) (6, 10)
  4. (6, 8) (10,)
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Travou em uma questão sua? Ajuda com Tarefas

Termos-Chave

73 Termos-Chave, cada um com sua definição

A

Acumulador
Um acumulador é uma variável que mantém um resultado acumulado entre passagens de um laço, como um total atualizado pela adição de cada item.
Defina total = 0 antes de processar as medições e use total += reading para manter as adições anteriores.
append()
O método de lista append() adiciona seu argumento como um item ao final da lista existente e retorna None.
Acrescentar [3, 4] a [1, 2] produz [1, 2, [3, 4]], porque o argumento continua sendo um item.
Argumento padrão mutável
Um argumento padrão mutável é um objeto alterável criado quando uma função é definida e reutilizado por chamadas que omitem esse argumento.
Um valor padrão basket=[] mantém os itens acrescentados entre chamadas que usam o valor padrão porque cada chamada alcança a mesma lista.
Atribuição a fatia
A atribuição a fatia substitui um intervalo selecionado em uma sequência mutável; um intervalo contíguo pode receber uma quantidade diferente de itens.
values[1:2] = [8, 9] substitui uma posição por dois valores, aumentando o tamanho da lista em um.
Atribuição a item
A atribuição a item substitui o objeto em uma posição existente de uma sequência mutável e mantém inalterado o tamanho da sequência externa.
prices[1] = 6.5 corrige um preço registrado; ela não pode criar um item no índice len(prices).

B

Busca pela primeira correspondência
Uma busca pela primeira correspondência visita itens até que um atenda a um teste, salva seu resultado e para antes que correspondências posteriores possam substituí-lo.
Um laço pode armazenar o índice da primeira medição negativa e usar break para encerrar a busca imediatamente.

C

Célula
Uma célula é um valor em uma tabela, acessado pela seleção de sua linha e depois de sua posição nessa linha.
grid[0][2] = 9 substitui a terceira célula da primeira linha, supondo que essa posição já exista.
Chave em tupla
Uma chave em tupla combina campos de comparação em ordem de prioridade, com campos posteriores decidindo apenas quando todos os anteriores empatam.
Retornar (-score, name) classifica notas da maior para a menor e usa nomes de A a Z para desempatar notas.
Chave que não distingue maiúsculas de minúsculas
Uma chave que não distingue maiúsculas de minúsculas compara valores de texto normalizados, mantendo a grafia original de cada string na coleção retornada.
key=str.lower permite que "Oak" e "oak" sejam considerados iguais na comparação sem alterar suas letras maiúsculas.
Concatenação
A concatenação une sequências de ponta a ponta; a concatenação de listas com + cria uma nova lista externa a partir de duas listas.
morning + afternoon pode combinar duas listas de medições, deixando cada lista original intacta.
Contador
Um contador é uma variável que registra quantas vezes uma condição é atendida, geralmente começando em 0 e aumentando em 1 por correspondência.
Um contador de notas adiciona 1 para cada nota de aprovação, seja ela 60 ou 100.
Cópia profunda
Uma cópia profunda duplica recursivamente uma estrutura aninhada para que alterações nas listas internas copiadas não alcancem as listas internas originais.
copy.deepcopy(rows) pode preservar as células da tabela original enquanto uma estrutura aninhada separada é editada.
Cópia superficial
Uma cópia superficial cria um novo contêiner externo, mantendo referências aos itens originais, inclusive a quaisquer listas internas mutáveis.
Após b = a.copy(), acrescentar um item a b altera sua lista externa, mas editar uma linha compartilhada também pode afetar a.
count()
O método de lista count() retorna o número de itens iguais ao seu argumento e retorna 0 quando o valor está ausente.
[2, 2.0, 5].count(2) é 2 porque tanto o inteiro 2 quanto o número de ponto flutuante 2,0 são considerados iguais a 2 na comparação.
Critério de desempate
Um critério de desempate é uma regra secundária de comparação usada quando uma regra anterior produz chaves iguais, como comparar nomes após notas iguais.
Dois registros com nota 80 podem ser ordenados pelo nome quando a chave inclui esse nome após a nota.

D

Desempacotamento
O desempacotamento atribui itens de um iterável a vários alvos em ordem, exigindo quantidades iguais, a menos que um asterisco reúna os itens restantes.
name, score = ("Kai", 86) dá a cada campo do registro um nome de variável separado e significativo.

E

Empacotamento
O empacotamento reúne vários valores de expressões em uma tupla, geralmente usando vírgulas sem exigir parênteses ao redor.
result = lowest, highest armazena ambos os valores em uma tupla que pode ser retornada por uma função.
enumerate()
A função embutida enumerate() fornece pares que contêm um número sequencial e um item, começando por padrão com o número 0.
for i, value in enumerate(values): fornece ao código tanto um índice quanto seu item atual correspondente.
extend()
O método de lista extend() adiciona cada item de um iterável ao final da lista existente e retorna None.
Estender [1, 2] com [3, 4] produz quatro itens externos; estender com "ab" adiciona dois caracteres.

F

Fatia
Uma fatia seleciona uma sequência de itens usando limites e um passo opcional, retornando uma nova sequência do tipo original.
tasks[1:4] cria uma lista das posições 1, 2 e 3 sem incluir o item na posição 4.
Filtragem
A filtragem cria uma coleção de itens que atendem a uma condição, deixando de fora os itens que não a atendem.
Um laço pode acrescentar apenas notas de pelo menos 60 a uma nova lista, preservando a ordem original das notas.
Função de chave
Uma função de chave calcula um valor de comparação a partir de cada item de entrada, mantendo intactos os itens originais na saída ordenada.
Usar key=len ordena palavras pelo tamanho sem substituí-las pelos números de seus tamanhos.

I

Identidade
Identidade é a propriedade de ser o mesmo objeto, testada por is; conteúdos iguais podem pertencer a objetos de lista diferentes.
Dois literais [1, 3] separados são considerados iguais, mas um teste de identidade entre essas listas é falso.
Imutabilidade
Imutabilidade significa que o próprio estado de um objeto não pode ser alterado no próprio objeto; uma tupla fixa suas referências aos itens, não os objetos mutáveis dentro dela.
Uma tupla que contém uma lista não pode substituir essa posição, mas a lista armazenada ainda pode receber um item por append.
index()
O método de lista index() encontra o primeiro item igual em seu intervalo de busca e retorna o índice desse item na lista inteira.
labels.index("go", 2) começa a busca na posição 2, mas ainda conta sua resposta a partir da posição 0.
insert()
O método de lista insert() adiciona um item antes de uma posição especificada, deslocando os itens seguintes e aumentando o tamanho da lista.
queue.insert(0, "urgent") coloca um novo item no início sem sobrescrever o primeiro item anterior.
Inversão de ordem
A inversão de ordem troca o sentido da ordem existente de uma sequência sem escolher posições pelo valor, portanto não precisa produzir ordem crescente ou decrescente.
values.reverse() altera uma lista, enquanto values[::-1] cria uma cópia superficial invertida.
Item
Um item é um valor mantido em uma posição de uma coleção; uma lista aninhada conta como um item de sua lista externa.
Em ["desk", ["pen", "pad"]], a lista externa tem dois itens, embora a lista interna contenha duas strings.
Iteração
Iteração é o processamento repetido de itens fornecidos por vez, como em um laço for que visita uma lista do primeiro ao último item.
Um laço sobre names atribui cada nome atual à variável do laço antes de executar seu corpo.
Iterável
Um iterável é um objeto que pode fornecer itens um por vez a um laço ou a uma função como list().
Uma sequência range fornece números, portanto list(range(3)) os reúne na nova lista [0, 1, 2].

Í

Índice
Um índice é uma posição inteira usada para selecionar um item; o Python conta a partir de 0 no início ou de -1 no fim.
Para colors = ["blue", "gold"], o índice 1 seleciona 'gold', que também é o item no índice -1.

J

join()
O método de string join() combina strings fornecidas em uma única string, colocando entre os itens a string sobre a qual é chamado.
" / ".join(["red", "blue"]) cria 'red / blue'; itens numéricos devem primeiro ser convertidos em strings.

L

Laço aninhado
Um laço aninhado é um laço dentro de outro; o laço interno conclui seu trabalho a cada passagem do laço externo.
Um laço de linhas que contém um laço de células pode processar tabelas com quantidades diferentes de itens em cada linha.
Limite de parada
Um limite de parada é a extremidade excluída de uma fatia; as posições selecionadas terminam antes desse limite no sentido do passo.
Em values[2:5], o índice 5 marca onde a seleção para e não contribui com um item.
Limite omitido
Um limite omitido permite que uma fatia use a extremidade adequada de uma sequência, conforme seu passo avance ou retroceda.
Em values[::-1], os limites omitidos permitem que a fatia percorrida para trás inclua a lista inteira em ordem inversa.
Linha
Uma linha em uma tabela baseada em listas é uma lista interna, selecionada pelo primeiro índice antes que um segundo índice selecione uma célula nela.
grid[1] recupera a segunda linha inteira, portanto len(grid[1]) conta as células dessa linha.
Linha compartilhada
Uma linha compartilhada é uma lista interna referenciada por várias posições de tabela, de modo que a edição de uma célula pode aparecer em mais de uma linha exibida.
table = [row, row] armazena uma linha duas vezes, embora imprimir a tabela exiba duas posições de linha.
Lista
Uma lista é uma coleção ordenada e mutável cujos itens podem ser lidos pela posição e podem conter valores repetidos ou de tipos diferentes.
Um programa pode armazenar vários resultados de um teste em scores = [73, 91, 73] e processá-los juntos.
Lista aninhada
Uma lista aninhada é uma lista que contém outras listas; cada lista interna é um item que pode ser acessado e processado separadamente.
Em [[2, 5], [7]], a lista externa contém duas linhas cujos tamanhos são dois e um.
Lista externa
Uma lista externa é o contêiner que contém objetos internos; alterar uma de suas posições é diferente de alterar o objeto nessa posição.
b[0] = [9] substitui uma referência de linha, enquanto b[0].append(9) altera o objeto de linha existente.

M

Máximo acumulado
Um máximo acumulado é o maior item visto até o momento, inicializado a partir de um item real e substituído sempre que um item maior aparece.
Começar pela primeira medição permite que o padrão encontre corretamente o maior valor quando todas as medições são negativas.
Média aritmética
A média aritmética de uma coleção numérica não vazia é seu total dividido pela contagem de itens; aqui uma coleção vazia não tem média.
Para as medições [6, 10, 14], sum(readings) / len(readings) calcula a média como 10.0.
Mediana
A mediana é o valor do meio em dados ordenados; para uma lista não vazia de tamanho ímpar, é o item no índice len(ordered) // 2.
Ordenar [5, 12, 2] produz [2, 5, 12], colocando a mediana 5 no índice do meio, 1.
Método
Um método é uma função associada a um objeto e chamada por meio de notação com ponto para executar uma operação nesse objeto.
queue.append("next") chama o método da lista e fornece o item a adicionar como seu argumento.
Mutação
Uma mutação altera o conteúdo ou o estado de um objeto existente, portanto toda referência a esse objeto pode observar a mesma alteração.
items[0] = 7 altera a lista; qualquer referência alternativa a essa lista vê sua primeira posição se tornar 7.

N

Nome com asterisco
Um nome com asterisco no desempacotamento reúne todos os valores não atribuídos aos alvos sem asterisco e sempre recebe uma lista.
Em first, *rest = (4, 8, 12), rest é [8, 12], embora a entrada seja uma tupla.
Nova associação de nome
Uma nova associação de nome altera o objeto ao qual um nome se refere sem redirecionar outros nomes que se referiam ao objeto anterior.
Após b = a, atribuir b = [] dá a b uma nova lista, enquanto a continua se referindo à original.

O

Operação no próprio objeto
Uma operação no próprio objeto altera um objeto existente, de modo que outras referências a esse objeto observem o mesmo estado alterado.
values.clear() esvazia a lista existente, portanto toda referência alternativa vê essa lista ficar vazia.
Ordem decrescente
A ordem decrescente coloca valores de comparação maiores antes dos menores e é solicitada com a opção nomeada de ordenação reverse=True.
A ordenação decrescente de [5, 1, 8] produz [8, 5, 1]; apenas inverter suas posições produz [8, 1, 5].
Ordem lexicográfica
A ordem lexicográfica compara sequências da esquerda para a direita: o primeiro par diferente decide a ordem, ou um prefixo correspondente mais curto vem primeiro.
[3, 20] < [4, 1] é verdadeiro porque os primeiros itens decidem a ordem antes que os segundos sejam comparados.
Ordenação estável
A ordenação estável preserva a ordem relativa de entrada dos itens cujas chaves de comparação são iguais, inclusive em ordem decrescente.
Palavras com tamanhos iguais permanecem em sua ordem relativa original quando a única função de chave é len.

P

Parâmetro de lista
Um parâmetro de lista é um nome local de função que se refere inicialmente ao objeto de lista do código chamador, permitindo que a função altere esse objeto.
Uma função que chama values.clear() esvazia a lista do código chamador; atribuir values = [] não a esvazia.
Passo da fatia
Um passo da fatia é um inteiro diferente de zero que controla o espaçamento e a direção entre as posições selecionadas de uma sequência.
values[1::2] seleciona itens a cada duas posições a partir de 1; um passo negativo percorre para trás.
pop()
O método de lista pop() remove e retorna um item pelo índice, usando a última posição quando nenhum índice é fornecido.
current = queue.pop(0) salva o primeiro item da fila e remove essa posição da lista existente.

R

Referência
Uma referência conecta um nome ou uma posição de contêiner a um objeto; copiar essa referência não copia o próprio objeto.
b = a dá a ambos os nomes de variáveis um caminho até a mesma lista, portanto alterações podem ser compartilhadas.
Referência alternativa
Uma referência alternativa é outro nome ou referência para o mesmo objeto, permitindo que uma mutação feita por um caminho apareça por outro.
Se current = queue, acrescentar um item por meio de current também altera a lista alcançada por queue.
Registro
Um registro é um grupo de campos relacionados que descrevem uma entidade, frequentemente armazenado como uma tupla cujas posições têm significados distintos.
("Kai", 86) pode representar um nome e uma nota; uma lista desses registros pode crescer à medida que os resultados chegam.
remove()
O método de lista remove() exclui o primeiro item igual ao seu argumento e lança ValueError quando não há correspondência.
labels.remove("old") exclui um valor correspondente; ele não interpreta "old" como uma posição.
Repetição
A repetição usa * com um inteiro para repetir em ordem as referências aos itens de uma sequência, produzindo uma sequência vazia para contagens não positivas.
[0] * 5 cria cinco posições de contadores, enquanto repetir uma lista de linha pode criar linhas internas compartilhadas.
reversed()
A função embutida reversed() fornece itens de uma sequência do último ao primeiro sem reorganizar as posições armazenadas na sequência.
for task in reversed(tasks): processa a última tarefa primeiro, mantendo a ordem original da lista.

S

sort()
O método de lista sort() reorganiza a lista existente em ordem de comparação e retorna None, com argumentos opcionais de chave e de ordem inversa.
scores.sort() altera diretamente a ordem registrada, e referências alternativas a scores veem as posições ordenadas.
sorted()
A função embutida sorted() aceita um iterável e retorna uma nova lista de seus itens em ordem de comparação, deixando a ordem da entrada inalterada.
ordered = sorted(scores) mantém disponível a ordem original de chegada por meio da variável scores.
split()
O método de string split() divide texto em uma lista de partes que são strings, usando um separador especificado ou regras para caracteres em branco.
"yes|no|maybe".split("|") cria três itens de texto separados a partir da entrada delimitada pelo separador.

T

Teste de pertencimento
Um teste de pertencimento verifica se um valor igual aparece em uma coleção e retorna um resultado booleano por meio de in ou not in.
"ready" in statuses pode determinar se uma lista contém essa string de status exata, distinguindo maiúsculas de minúsculas.
Transformação
Uma transformação calcula um valor de saída a partir de um item de entrada, frequentemente criando uma nova lista com um resultado por item original.
Acrescentar int(text) para cada string numérica cria uma lista que pode ser somada com sum().
Troca simultânea
Uma troca simultânea avalia ambos os valores antigos antes de atribuí-los aos nomes opostos em uma única instrução de desempacotamento.
left, right = right, left preserva ambos os valores sem exigir um valor temporário com nome separado.
Tupla
Uma tupla é uma sequência ordenada cujas posições de itens não podem ser substituídas, adicionadas ou removidas depois que a tupla é criada.
location = (5, 9) armazena um par fixo de coordenadas, que ainda aceita indexação e extração de fatias.
Tupla de um item
Uma tupla de um item é uma tupla com uma única posição, escrita com uma vírgula final para distingui-la de uma expressão agrupada.
(11,) é uma tupla, enquanto (11) é avaliado como o inteiro 11 sem criar uma coleção.

V

Valor de retorno
Um valor de retorno é o objeto que uma chamada de função produz para seu código chamador, distinto de quaisquer alterações feitas nos argumentos durante a chamada.
Uma função pode acrescentar um item a uma lista e ainda retornar None quando seu corpo não tem uma instrução de retorno explícita.
Valor hashável
Um valor hashável atende às regras de consulta estável necessárias para chaves de dicionário; tuplas exigem conteúdo hashável, e listas não são hasháveis.
(5, 9) pode ser uma chave de coordenada, mas ([5], 9) não pode porque sua lista interna não é hashável.
Valor padrão None
Um valor padrão None pode indicar um argumento de lista omitido para que uma função crie uma nova lista em seu corpo a cada chamada que use o valor padrão.
Com values=None, o ramo if values is None: values = [] evita uma lista padrão compartilhada acidentalmente.
Variável do laço
Uma variável do laço é um nome associado ao item atual em cada passagem; associá-la a outro objeto não faz uma atribuição à lista original.
Em for value in values: value = 0, o nome do laço muda, mas as posições armazenadas na lista não.

Z

zip()
A função embutida zip() forma pares com itens correspondentes dos iteráveis de entrada e, por padrão, para quando a entrada mais curta termina.
Formar pares com três nomes e duas notas cria dois pares; o nome sem correspondência exige uma decisão separada.

Sobre esta aula

Por StudeliRelatar um erro

Crie seus próprios Materiais de Estudo

Transforme suas anotações, slides e documentos em Guias de Estudo, Questões de Prática, Flashcards e mais 6 ferramentas.

Começar