- Aprender
- Computação e TI
- Programação
- Introdução à programação com Python
- Listas e tuplas em Python
Listas e tuplas em Python
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
- 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 índiceEscreva 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 listaExtraia 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 embutidasUna 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.
- Crie uma lista e leia seus itens pelo índice
- 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 itensAumente 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 itensLocalize valores com index(), count() e in, e substitua itens individuais ou intervalos inteiros atribuindo valores a um índice ou a uma fatia.
- Adicione e remova itens
- 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çõesEscolha 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 listasSome, 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 aninhadasArmazene uma tabela como uma lista de linhas, leia e altere células com dois índices e visite cada célula com laços aninhados.
- Percorra itens e posições
- 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 listasEscreva 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 valoresAtribua 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.
- Crie tuplas e escolha entre tuplas e listas
- 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 alternativasExplique 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 compartilhadasFaç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-asPreveja 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.
- Distinga nomes, objetos e referências alternativas
- 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 registrosOrdene 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.
- Ordene com sort() e sorted()
Guia de estudo de Listas e tuplas em Python
1Crie 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ão | Resultado | Posição |
|---|---|---|
scores[0] | 88 | Primeira |
scores[1] | 92 | Segunda |
scores[2] | 75 | Terceira |
scores[-1] | 75 | Última |
scores[-2] | 92 | Penúltima |
scores[-3] | 88 | Antepenú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çaTypeError. intesta 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
| Fatia | Significado | Resultado |
|---|---|---|
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ão | Resultado |
|---|---|
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,minemaxproduzem 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.
splitcria partes de texto;joinde um separador combina strings.
2Altere 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ção | Usa | Retorna |
|---|---|---|
items.pop() | Última posição | Item removido |
items.pop(i) | Posição i | Item removido |
items.remove(x) | Primeiro valor igual a x | None |
del items[i] | Posição i | Nenhum valor de retorno |
del items[start:stop] | Fatia de posições | Nenhum valor de retorno |
items.clear() | Lista inteira | None |
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
appendadiciona um item;extendadiciona cada item fornecido.insertadiciona antes de uma posição e desloca os itens seguintes.popremove por posição e retorna o item.removeexclui o primeiro valor igual e falha se ele estiver ausente.delexclui posições ou fatias;clearesvazia a mesma lista.- Métodos como
appendretornamNone, 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ção | Efeito 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
indexretorna a primeira posição correspondente e lançaValueErrorpara um valor ausente.countretorna 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.
3Processe 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 eenumeratepara ambos. - Associar a variável do laço a outro valor não substitui um item da lista.
zippara na entrada mais curta.reversedpercorre para trás sem alterar a lista.- Um laço
whiledeve avançar seu índice e parar antes delen(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
breakpara 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.
4Use 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ão | Valor 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, apara preservar ambos os valores antigos. - Vários valores de retorno costumam ser empacotados em uma tupla.
5Acompanhe 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ção | O que muda? | O que uma referência alternativa vê? |
|---|---|---|
b.append(4) | Lista existente | Item adicionado |
b[0] = 9 | Lista existente | Item substituído |
b = [7, 8] | O nome b | Lista 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, enquantoisverifica 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()ecopy()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.deepcopycopia 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
Nonee crie uma lista dentro da função para obter um novo valor padrão.
6Coloque 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] | Resultado | Altera 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
sortaltera uma lista e retornaNone;sortedretorna uma nova lista.sortedaceita iteráveis como tuplas e strings.reverse=Trueordena 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=lenoukey=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.
minemaxretornam itens originais e escolhem o primeiro em caso de empate de chaves.
Exercícios resolvidos de Listas e tuplas em Python
1Leia as contagens de entregas de uma semana
13 passos
- 1Introduçã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. - 2ExemploAssocie 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 comodeliveries[-1], usando um índice negativo a partir do fim. - 3DicaVerifique 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 é
Truee depoisFalse. O valor 9 aparece, mas 4 não, embora 4 seja um índice válido.inverifica os valores armazenados. Se você quiser a contagem na posição 4, usedeliveries[4], que retorna17. - 4DesafioEncontre a penúltima contagem
O que
deliveries[-2]retorna, edeliveries[len(deliveries)]funcionaria?---reveal---
O índice negativo
-2seleciona9, uma posição antes do último item17. A segunda expressão tenta acessar o índice 5 e lança IndexError. Uselen(deliveries) - 1ou-1para selecionar o último item; o número de itens está uma posição além do índice não negativo final. - 5ExemploSelecione 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 emdeliveries. - 6Explicaçã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. - 7ExemploPercorra 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. - 8DesafioDistinga uma contagem de uma lista
Quais são os valores e tipos de
deliveries[2]edeliveries[2:3]?---reveal---
deliveries[2]é o inteiro15.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. - 9ExemploCalcule 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 é
31e depois10.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. - 10Ideia-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. Emborasum([])seja 0, dividir esse total porlen([])causaria uma divisão por zero.minemaxtambém falham com essas entradas vazias. - 11Conexã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.splitfaz o caminho inverso, dividindo texto em partes que são strings. - 12DesafioSelecione, 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 emdeliveries[2]permanece 15. - 13Recapitulaçã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.
2Edite uma solicitação de materiais
10 passos
Salve esta aula para seguir cada Lição Interativa passo a passo.
- 1IntroduçãoAcompanhe a lista e o valor retornado
- 2ExemploAdicione um lote de itens
- 3ExemploColoque um item no início
- 4ExemploRemova e salve um item recolhido
- 5DesafioEscolha uma remoção por valor
- 6ExemploEncontre a posição de uma correção
- 7ExemploSubstitua um item por um lote
- 8DesafioExclua um intervalo e encontre um valor
- 9DesafioFinalize a solicitação sem perdê-la
- 10RecapitulaçãoAssocie a alteração à operação
3Limpe medições e some uma tabela
13 passos
Salve esta aula para seguir cada Lição Interativa passo a passo.
- 1IntroduçãoDecida o que cada laço mantém
- 2ExplicaçãoLeia um valor sem editar sua posição
- 3ExemploSubstitua medições inválidas pelo índice
- 4ConexãoAssocie rótulos a medições
- 5DesafioExplique um item ignorado
- 6ExemploConte as medições positivas
- 7ExemploCrie um resultado filtrado e transformado
- 8DicaBusque até a primeira correspondência
- 9DesafioEscolha um máximo válido
- 10ExemploSelecione uma linha e uma célula
- 11ExemploSome todas as linhas
- 12DesafioFiltre toda a tabela
- 13RecapitulaçãoSepare a preparação do trabalho repetido
4Use um registro fixo e desempacote seus campos
10 passos
Salve esta aula para seguir cada Lição Interativa passo a passo.
- 1IntroduçãoMantenha um registro reunido
- 2ExemploCrie o registro da estação
- 3Ideia-chaveTeste o limite da imutabilidade
- 4DesafioCrie uma tupla de um item
- 5ExemploDê um nome a cada campo
- 6ExemploMantenha a primeira medição e as restantes
- 7DesafioTroque valores de coordenadas
- 8ExemploRetorne um par de extremos
- 9DesafioLeia e desempacote um campo selecionado
- 10RecapitulaçãoLeia a estrutura antes de desempacotar
5Rastreie uma tabela copiada por meio de uma função
14 passos
Salve esta aula para seguir cada Lição Interativa passo a passo.
- 1IntroduçãoDesenhe caminhos até os objetos
- 2ExemploCrie uma referência alternativa
- 3ExemploRedirecione um nome
- 4DesafioPreveja dois tipos de adição
- 5ExemploCopie a tabela externa
- 6ExemploAltere uma linha compartilhada
- 7Ideia-chaveSubstitua uma linha copiada
- 8DesafioEscolha uma cópia mais profunda
- 9ExemploAltere por meio de um parâmetro
- 10ConexãoRetorne uma lista separada
- 11ExplicaçãoEvite uma lista padrão persistente
- 12DesafioDistinga a nova associação local da limpeza
- 13DesafioRastreie uma cópia superficial passada a uma função
- 14RecapitulaçãoRastreie o nível que está sendo alterado
6Classifique registros sem perder sua ordem de chegada
13 passos
Salve esta aula para seguir cada Lição Interativa passo a passo.
- 1IntroduçãoSepare dados armazenados de chaves de comparação
- 2ExemploMantenha a ordem de chegada
- 3ExemploCompare inversão com ordenação decrescente
- 4DicaVerifique o tipo da entrada
- 5DesafioAcompanhe o resultado de uma ordenação
- 6ExemploEscolha uma chave de nota
- 7Ideia-chaveMantenha registros empatados na ordem de chegada
- 8DesafioPasse um objeto chamável
- 9ExemploAdicione um critério de desempate alfabético
- 10DicaInverta apenas o sentido numérico
- 11ConexãoSelecione um item por uma chave extrema
- 12DesafioMantenha registros e nomes em suas formas originais
- 13RecapitulaçãoEscolha o efeito e a regra
Questões de Listas e tuplas em Python
Conjunto 1: Leia, extraia fatias e altere sequências10 Questões de Prática
Questão 1 de 10
levels = [14, 29, 37, 52], quanto é levels[-2]?Mostrar respostaOcultar resposta
-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
codes = [2, 5, 8, 11, 14, 17], quanto é codes[1:5:2]?Mostrar respostaOcultar resposta
[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"])
Mostrar respostaOcultar resposta
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])
Mostrar respostaOcultar resposta
'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]
Mostrar respostaOcultar resposta
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
Mostrar respostaOcultar resposta
(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)
Mostrar respostaOcultar resposta
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])
Mostrar respostaOcultar resposta
[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
items = [9, 16, 25], o que acontece quando o Python avalia items[len(items)]?Mostrar respostaOcultar resposta
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
[4, 99] < [5, 1]?Mostrar respostaOcultar resposta
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)
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)
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 3 de 10
table = [[6, 8, 10], [11, 13, 15]], o que table[1][0] + table[0][2] produz?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 4 de 10
list(zip(["Lee", "Mo", "Nia"], [41, 56])) contém?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])
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
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)
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 8 de 10
[-14, -6, -19]. Com o que seu máximo acumulado deve ser inicializado?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)
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
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
label, amount = ("rice", 4), qual valor amount contém?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 2 de 10
middle após first, *middle, last = (2, 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)
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)
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)
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)
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)
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 8 de 10
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)
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)
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
tags = ["new", "old", "new"], o que tags.count("done") retorna?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)
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])
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)
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)
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)
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]
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 8 de 10
codes = ["q", "r", "q", "s", "q"], quanto é codes.index("q", 1)?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)
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)
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
result contém após nums = [8, 2, 5] e result = nums.sort()?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 2 de 10
sorted(["20", "3", "11"]) retorna?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 3 de 10
sorted(["pear", "a", "plum", "to"], key=len) retorna?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 4 de 10
values = [6, 1, 4], qual par de resultados vem de values[::-1] e sorted(values, reverse=True), nessa ordem?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 5 de 10
(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?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))
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))
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))
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)
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 10 de 10
(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?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
values = [12, 24], quanto é values[5:20]?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 2 de 10
None caso contrário?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)
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)
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])
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)
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)
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)
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 9 de 10
[31, 12, 27, 18, 24, 15, 21]. Após ordenar uma cópia, qual é o valor do meio?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)
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Travou em uma questão sua? Ajuda com Tarefas
Termos-Chave
A
Acumulador
total = 0 antes de processar as medições e use total += reading para manter as adições anteriores.append()
append() adiciona seu argumento como um item ao final da lista existente e retorna None.[3, 4] a [1, 2] produz [1, 2, [3, 4]], porque o argumento continua sendo um item.Argumento padrão mutável
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
values[1:2] = [8, 9] substitui uma posição por dois valores, aumentando o tamanho da lista em um.Atribuição a item
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
break para encerrar a busca imediatamente.C
Célula
grid[0][2] = 9 substitui a terceira célula da primeira linha, supondo que essa posição já exista.Chave em tupla
(-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
key=str.lower permite que "Oak" e "oak" sejam considerados iguais na comparação sem alterar suas letras maiúsculas.Concatenação
+ 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
Cópia profunda
copy.deepcopy(rows) pode preservar as células da tabela original enquanto uma estrutura aninhada separada é editada.Cópia superficial
b = a.copy(), acrescentar um item a b altera sua lista externa, mas editar uma linha compartilhada também pode afetar a.count()
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
D
Desempacotamento
name, score = ("Kai", 86) dá a cada campo do registro um nome de variável separado e significativo.E
Empacotamento
result = lowest, highest armazena ambos os valores em uma tupla que pode ser retornada por uma função.enumerate()
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()
extend() adiciona cada item de um iterável ao final da lista existente e retorna None.[1, 2] com [3, 4] produz quatro itens externos; estender com "ab" adiciona dois caracteres.F
Fatia
tasks[1:4] cria uma lista das posições 1, 2 e 3 sem incluir o item na posição 4.Filtragem
Função de chave
key=len ordena palavras pelo tamanho sem substituí-las pelos números de seus tamanhos.I
Identidade
is; conteúdos iguais podem pertencer a objetos de lista diferentes.[1, 3] separados são considerados iguais, mas um teste de identidade entre essas listas é falso.Imutabilidade
index()
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()
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
values.reverse() altera uma lista, enquanto values[::-1] cria uma cópia superficial invertida.Item
["desk", ["pen", "pad"]], a lista externa tem dois itens, embora a lista interna contenha duas strings.Iteração
for que visita uma lista do primeiro ao último item.names atribui cada nome atual à variável do laço antes de executar seu corpo.Iterável
list().list(range(3)) os reúne na nova lista [0, 1, 2].Í
Índice
colors = ["blue", "gold"], o índice 1 seleciona 'gold', que também é o item no índice -1.J
join()
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
Limite de parada
values[2:5], o índice 5 marca onde a seleção para e não contribui com um item.Limite omitido
values[::-1], os limites omitidos permitem que a fatia percorrida para trás inclua a lista inteira em ordem inversa.Linha
grid[1] recupera a segunda linha inteira, portanto len(grid[1]) conta as células dessa linha.Linha compartilhada
table = [row, row] armazena uma linha duas vezes, embora imprimir a tabela exiba duas posições de linha.Lista
scores = [73, 91, 73] e processá-los juntos.Lista aninhada
[[2, 5], [7]], a lista externa contém duas linhas cujos tamanhos são dois e um.Lista externa
b[0] = [9] substitui uma referência de linha, enquanto b[0].append(9) altera o objeto de linha existente.M
Máximo acumulado
Média aritmética
[6, 10, 14], sum(readings) / len(readings) calcula a média como 10.0.Mediana
len(ordered) // 2.[5, 12, 2] produz [2, 5, 12], colocando a mediana 5 no índice do meio, 1.Método
queue.append("next") chama o método da lista e fornece o item a adicionar como seu argumento.Mutaçã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
first, *rest = (4, 8, 12), rest é [8, 12], embora a entrada seja uma tupla.Nova associação de nome
b = a, atribuir b = [] dá a b uma nova lista, enquanto a continua se referindo à original.O
Operação no próprio objeto
values.clear() esvazia a lista existente, portanto toda referência alternativa vê essa lista ficar vazia.Ordem decrescente
reverse=True.[5, 1, 8] produz [8, 5, 1]; apenas inverter suas posições produz [8, 1, 5].Ordem lexicográfica
[3, 20] < [4, 1] é verdadeiro porque os primeiros itens decidem a ordem antes que os segundos sejam comparados.Ordenação estável
len.P
Parâmetro de lista
values.clear() esvazia a lista do código chamador; atribuir values = [] não a esvazia.Passo da fatia
values[1::2] seleciona itens a cada duas posições a partir de 1; um passo negativo percorre para trás.pop()
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
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
current = queue, acrescentar um item por meio de current também altera a lista alcançada por queue.Registro
("Kai", 86) pode representar um nome e uma nota; uma lista desses registros pode crescer à medida que os resultados chegam.remove()
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
* 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()
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()
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()
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()
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
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
int(text) para cada string numérica cria uma lista que pode ser somada com sum().Troca simultânea
left, right = right, left preserva ambos os valores sem exigir um valor temporário com nome separado.Tupla
location = (5, 9) armazena um par fixo de coordenadas, que ainda aceita indexação e extração de fatias.Tupla de um item
(11,) é uma tupla, enquanto (11) é avaliado como o inteiro 11 sem criar uma coleção.V
Valor de retorno
None quando seu corpo não tem uma instrução de retorno explícita.Valor hashável
(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
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.values=None, o ramo if values is None: values = [] evita uma lista padrão compartilhada acidentalmente.Variável do laço
for value in values: value = 0, o nome do laço muda, mas as posições armazenadas na lista não.Z
zip()
zip() forma pares com itens correspondentes dos iteráveis de entrada e, por padrão, para quando a entrada mais curta termina.Sobre esta aula
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.