- Aprender
- Computação e TI
- Programação
- Introdução à programação com Python
- Dicionários e conjuntos em Python
Dicionários e conjuntos em Python
BásicoAula 7 de 10 do curso Curso de Introdução à programação com Python
O que você vai aprender
- Explique o que é um dicionário, crie um a partir de pares chave-valor, leia valores por chave sem interromper o programa quando uma chave estiver ausente e adicione, altere e remova entradas.
- Crie dicionários a partir de pares chave-valorDescreva um dicionário como uma coleção que associa chaves únicas a valores, escreva literais de dicionário, crie dicionários com
dict()e escolha chaves que o Python aceita. - Consulte valores por chave com segurançaLeia um valor com colchetes, verifique se uma chave existe com
ine useget()para fornecer um valor padrão em vez de interromper o programa quando uma chave estiver ausente. - Adicione, altere e remova entradasInsira novos itens, atualize valores existentes, mescle dois dicionários e exclua entradas com
del,pop()e métodos relacionados.
- Crie dicionários a partir de pares chave-valor
- Percorra cada chave, valor ou item de um dicionário, calcule totais e produza relatórios ordenados e crie novos dicionários com laços e compreensões de dicionário.
- Percorra chaves, valores e itensUse laços
forcom um dicionário,.values()e.items(), ordene chaves por nome ou valor e evite alterar o tamanho de um dicionário enquanto o percorre. - Crie novos dicionários a partir de dados existentesCrie dicionários com laços e compreensões de dicionário para transformar valores, filtrar itens, formar pares a partir de listas e trocar chaves por valores.
- Percorra chaves, valores e itens
- Use um dicionário como um conjunto de contadores, reúna itens em grupos e some valores por categoria, tarefas cotidianas que dicionários realizam em programas reais.
- Conte a frequência de ocorrênciasCrie uma tabela de frequências com um dicionário de contadores, conte palavras em um texto, encontre os itens mais comuns e reconheça
Countercomo um atalho. - Agrupe itens e some valores por categoriaReúna itens em listas sob uma chave comum, some valores por categoria, calcule médias de grupos e evite listas compartilhadas acidentalmente entre chaves.
- Conte a frequência de ocorrências
- Represente registros como dicionários dentro de dicionários ou listas, leia e atualize valores em qualquer nível e percorra dados aninhados para resumi-los.
- Armazene e acesse registros em dicionários aninhadosCrie dicionários de dicionários, listas de dicionários e dicionários de listas, acesse valores com consultas encadeadas, atualize-os e copie dados aninhados com segurança.
- Percorra e resuma dados aninhadosUse laços, incluindo laços aninhados, para produzir relatórios, filtrar e resumir registros e tratar registros com campos ausentes ou listas vazias.
- Armazene e acesse registros em dicionários aninhados
- Crie conjuntos de valores únicos, teste o pertencimento, compare coleções com união, interseção e diferença e escolha entre listas, tuplas, dicionários e conjuntos.
- Crie conjuntos e remova duplicatasEscreva e altere conjuntos, explique por que não têm duplicatas nem ordem, teste o pertencimento e remova duplicatas de uma lista mantendo ou não sua ordem.
- Compare coleções com operações de conjuntosUse união, interseção, diferença e diferença simétrica, teste subconjuntos, superconjuntos e conjuntos disjuntos e distinga operadores que retornam novos conjuntos de métodos que alteram um conjunto.
- Escolha a coleção adequada para uma tarefaCompare listas, tuplas, dicionários e conjuntos, escolha o que uma tarefa exige e combine-os, incluindo operações de conjuntos em chaves de dicionário.
- Crie conjuntos e remova duplicatas
Guia de estudo de Dicionários e conjuntos em Python
1Armazene e consulte dados com dicionários
Um dicionário associa cada chave a um valor, tornando a consulta por nome útil para contatos, estoques e outros registros. Para criar e alterar um dicionário, é preciso saber o que uma chave identifica e o que seu valor significa. A consulta segura permite que um programa distinga um registro ausente de um valor existente igual a zero. Adicionar, mesclar e remover pares altera essas informações armazenadas seguindo regras previsíveis de ordem de inserção.
1.1 Crie dicionários a partir de pares chave-valor
Um dicionário armazena pares: uma chave identifica um item, e seu valor contém a informação desejada. Uma lista de contatos é um modelo útil: um nome leva a um número de telefone. Uma consulta em dicionário usa uma chave, mesmo quando essa chave é um número.
Escreva os pares
ages = {"Ana": 31, "Ben": 27, "Cara": 35}
print(ages["Ben"])
print(len(ages))
Isso imprime 27 e depois 3. Os dois-pontos ligam cada chave a seu valor; as vírgulas separam os pares. len conta os pares. Tanto {} quanto dict() criam um dicionário vazio.
Cada chave aparece apenas uma vez. Em {"a": 1, "b": 2, "a": 3}, o valor posterior de "a" substitui o anterior, restando {'a': 3, 'b': 2}. Duas chaves diferentes podem ter o mesmo valor: {"Ana": "blue", "Ben": "blue"} continua tendo dois itens.
Crie a partir de outros dados
Escolha a forma que corresponde à entrada:
colors = dict(red=1, blue=2)
coordinates = dict([("x", 10), ("y", 20)])
labels = dict(zip(["a", "b", "c"], [1, 2, 3]))
A primeira forma cria chaves do tipo string a partir dos nomes dos argumentos. A segunda lê uma sequência de pares de dois itens. A terceira forma pares com elementos correspondentes de duas listas, produzindo {'a': 1, 'b': 2, 'c': 3}. As strings na primeira forma são 'red' e 'blue', não consultas a variáveis.
Escolha chaves utilizáveis
As chaves de dicionário devem ser hasháveis. Strings e números funcionam, assim como tuplas formadas inteiramente por itens hasháveis. Listas, dicionários e conjuntos comuns não funcionam como chaves. Para uma localização, use (2, 3), uma tupla, em vez de [2, 3], uma lista:
board = {(0, 0): "start", (2, 3): "treasure"}
print(board[(2, 3)])
Isso imprime treasure. Os parênteses fazem do par de coordenadas uma única chave. Uma tupla que contém uma lista ainda viola a regra de hashabilidade. Valores de dicionário não têm essa restrição: um valor pode ser uma lista, outro dicionário ou qualquer outro tipo.
Chaves numéricas iguais se referem à mesma entrada. Como 1, 1.0 e True são considerados iguais na comparação, {1: "one", 1.0: "float one"} contém um par, com o valor 'float one'. A string "1" é uma chave diferente do número 1.
Distinga ordem de identidade
Desde o Python 3.7, dicionários preservam a ordem de inserção. As idades acima aparecem como Ana, Ben, Cara quando impressas ou percorridas. Elas continuam tendo chaves, não posições de lista: ages[0] procura a chave 0 e lança KeyError: 0.
Dicionários são mutáveis. Após backup = ages, ambos os nomes se referem ao mesmo dicionário. Definir backup["Ana"] = 32 também altera o valor acessado por ages. Para copiar o dicionário externo, escreva backup = ages.copy() ou backup = dict(ages). Dicionários externos separados ainda podem compartilhar listas e dicionários aninhados.
Principais conclusões
- Cada chave única está associada a um valor;
len(d)conta os pares. - As chaves devem ser hasháveis; os valores podem ser de qualquer tipo.
- Chaves iguais compartilham uma entrada, e atribuições posteriores substituem seu valor.
- A ordem de inserção não transforma chaves de dicionário em posições.
- A atribuição compartilha um dicionário;
copy()cria um dicionário externo separado.
1.2 Consulte valores por chave com segurança
Uma consulta deve corresponder ao que uma chave ausente significa no seu programa. Às vezes ela indica um erro. Às vezes é normal, como no caso de um produto que ainda não foi contado. O Python oferece formas diferentes de tratar esses casos.
Leia um valor existente
stock = {"apples": 12, "pears": 0, "plums": 7}
print(stock["plums"])
A consulta com colchetes retorna 7. As chaves devem corresponder exatamente: "Plums" é diferente de "plums". Ler stock["kiwis"] lança KeyError: 'kiwis', pois essa chave está ausente. A consulta não fornece um valor vazio nem uma contagem igual a zero.
Use essa consulta direta quando uma chave for obrigatória. Nesse caso, um erro chama a atenção para dados incompletos ou um erro de digitação no ponto em que ocorre.
Verifique se uma chave existe
A expressão key in stock testa se uma chave existe. "pears" in stock é True, embora seu valor armazenado seja zero. "kiwis" not in stock também é True.
item = "kiwis"
if item in stock:
print(stock[item])
else:
print("No stock record for", item)
Aqui, a chave ausente leva a uma mensagem. A consulta ocorre apenas no ramo em que a chave existe.
O teste de pertencimento em um dicionário procura nas chaves. 12 in stock é False; para perguntar se algum item tem o valor armazenado 12, escreva 12 in stock.values(). A coleção colocada após in determina onde a busca é feita.
Leia com um valor padrão
stock.get("kiwis") retorna None sem lançar KeyError. Forneça um segundo argumento para escolher outro valor padrão: stock.get("kiwis", 0) retorna 0. Nenhuma das chamadas insere um novo item. Após ambas, o dicionário ainda contém apenas maçãs, peras e ameixas.
| Pergunta feita pelo programa | Forma útil |
|---|---|
| Qual é o valor desta chave obrigatória? | stock[item] |
| Esta chave existe? | item in stock |
| Qual é o valor ou a alternativa caso esteja ausente? | stock.get(item, 0) |
O valor padrão substitui uma consulta a uma chave ausente, não um valor armazenado. stock.get("pears", 99) retorna 0, pois peras já tem um valor.
Não confunda zero com ausência
if stock.get("pears"): verifica o valor lógico do resultado. Zero é falso, então esse ramo é ignorado. O mesmo teste também ignora uma chave ausente cuja consulta retorna None. Para distinguir esses casos, teste diretamente o pertencimento da chave.
Processe um pedido inteiro
prices = {"coffee": 3.5, "tea": 2.75}
order = ["tea", "coffee", "tea", "soda"]
total = 0
for item in order:
if item in prices:
total += prices[item]
else:
print("No price for", item)
print(total)
O primeiro chá leva o total a 2,75, o café o leva a 6,25 e o segundo chá o leva a 9,0. O refrigerante produz a mensagem No price for soda e não acrescenta nada. Uma consulta direta a cada passagem falharia no refrigerante; usar silenciosamente um preço padrão igual a zero esconderia o preço ausente. O ramo separado torna essa informação ausente visível.
Principais conclusões
d[key]lançaKeyErrorquando a chave está ausente.intesta chaves, incluindo chaves cujos valores são zero ou vazios.getretorna um valor ou um valor padrão sem inserir uma chave.- Escolha um valor padrão apenas quando ele fizer sentido para a tarefa.
1.3 Adicione, altere e remova entradas
Atualizações de dicionário usam chaves para identificar o que muda. Atribuir um valor pode adicionar um novo par ou substituir um valor antigo. Remover um par também pode retornar informações necessárias, como a quantidade retirada de um estoque.
Adicione e substitua
scores = {"Ana": 8}
scores["Ben"] = 6
scores["Ana"] = 9
scores["Ben"] += 2
print(scores)
O resultado é {'Ana': 9, 'Ben': 8}. Ben é adicionado, Ana é atualizada e, depois, a pontuação existente de Ben aumenta. A linha com += primeiro lê o valor antigo, então lança KeyError para uma chave ausente. Dicionários não têm o método append.
Combine dicionários
update copia pares para um dicionário existente. Com essas pontuações, scores.update({"Ben": 7, "Cara": 10}) altera a pontuação de Ben para 7 e adiciona Cara com 10.
Desde o Python 3.9, o operador de mesclagem pode criar um novo dicionário:
left = {"x": 1, "y": 2}
right = {"y": 5, "z": 3}
merged = left | right
print(merged)
Isso imprime {'x': 1, 'y': 5, 'z': 3}. O lado direito prevalece para uma chave comum. left permanece inalterado; left |= right o atualizaria no próprio objeto.
update() retorna None. Escrever scores = scores.update(new_scores) altera o dicionário antigo e depois faz scores se referir a None. Chame update em uma linha própria. Atribua o resultado de left | right quando quiser um novo dicionário mesclado.
Remova pares
| Operação | Efeito e valor de retorno |
|---|---|
del d[key] | Remove o par; uma chave ausente lança KeyError. |
d.pop(key) | Remove o par e retorna seu valor; uma chave ausente lança KeyError. |
d.pop(key, 0) | Retorna 0 se a chave estiver ausente. |
d.popitem() | Remove e retorna o par inserido mais recentemente como uma tupla. |
d.clear() | Remove todos os pares e retorna None. |
Para {"a": 1, "b": 2, "c": 3}, popitem() retorna ('c', 3). Isso usa a ordem de inserção, não a ordem alfabética nem o maior valor.
Acompanhe uma alteração no estoque
inventory = {"pens": 10, "pads": 4}
inventory["pens"] -= 3
inventory["clips"] = 50
removed = inventory.pop("pads")
A venda deixa 7 canetas. Adicionar clipes cria uma nova chave. Remover blocos armazena 4 em removed, deixando {'pens': 7, 'clips': 50}. O retorno de pop permite que o programa use a quantidade removida depois que o par foi retirado.
Insira apenas quando estiver ausente
setdefault(key, default) retorna o valor existente ou insere e retorna o valor padrão quando a chave está ausente. Para stock = {"apples": 12, "pears": 0, "plums": 7}, stock.setdefault("kiwis", 0) insere kiwis e retorna 0. stock.setdefault("apples", 99) retorna 12 e deixa maçãs inalteradas. Essa inserção é a diferença em relação a get.
Atualizar uma chave existente mantém sua posição. Começando com {"a": 1, "b": 2, "c": 3}, definir d["a"] = 10 mantém "a" em primeiro lugar. Excluir "a" e inseri-la novamente a coloca depois de "c". Um valor substituto e um par recém-inserido afetam a ordem de maneiras diferentes.
Principais conclusões
d[key] = valueadiciona uma chave ou substitui seu valor.- Na mesclagem de dicionários, o valor à direita prevalece para uma chave comum.
popretorna um valor removido;popitemretorna o último par inserido.updateeclearretornamNone.setdefaultinsere um valor padrão apenas para uma chave ausente.- Atualizar preserva a posição de uma chave; excluí-la e inseri-la novamente a move para o final.
2Percorra dicionários e crie novos dicionários
Laços transformam um dicionário em um relatório, um total ou a entrada de uma nova coleção. A primeira escolha é o que cada passagem exige: uma chave, um valor ou as duas partes de um par. A ordenação controla a ordem de um relatório sem reorganizar o dicionário original. Uma compreensão pode expressar uma regra curta para manter ou transformar pares, enquanto laços comuns deixam espaço para várias etapas de processamento e verificações.
2.1 Percorra chaves, valores e itens
Escolha um laço que forneça a parte necessária de cada par. Um dicionário usado diretamente fornece chaves. Suas visões podem fornecer valores ou pares inteiros, para que você não precise recuperar informações que o laço poderia fornecer diretamente.
Percorra chaves, valores ou pares
temps = {"Mon": 68, "Tue": 75, "Wed": 71}
for day, temp in temps.items():
print(day, temp)
As temperaturas estão em graus Fahrenheit. Isso imprime Mon 68, Tue 75 e Wed 71 em linhas separadas, na ordem de inserção. Cada item é uma tupla de dois elementos que o laço desempacota em day e temp.
| Entrada do laço | O que cada passagem recebe |
|---|---|
temps ou temps.keys() | Uma chave de dia |
temps.values() | Um valor de temperatura |
temps.items() | Um par (day, temperature) |
Com for day in temps:, use temps[day] dentro do laço quando precisar do valor correspondente. Se o programa precisar das duas partes em cada passagem, .items() geralmente expressa a tarefa com mais clareza.
Entenda as visões
keys(), values() e items() retornam visões, que refletem alterações posteriores em seu dicionário. Elas não são listas e não têm indexação por posição. temps.keys()[0] lança TypeError. Converta para uma lista quando precisar de uma cópia do estado atual com posições: list(temps) produz ['Mon', 'Tue', 'Wed'].
Calcule um total ou encontre uma chave correspondente
sum(temps.values()) retorna 214, e dividir por len(temps) produz uma média de aproximadamente 71,33. max(temps.values()) retorna 75. Para encontrar o dia que tem esse valor, escreva max(temps, key=temps.get), que retorna 'Tue'.
O argumento key= fornece uma função usada para comparação. Aqui, o Python percorre as chaves de dias e chama temps.get para cada uma, obtendo sua temperatura. Escreva o nome da função sem chamá-la: temps.get, não temps.get(). Se houver empate entre valores, max retorna a primeira chave que encontra.
Ordene um relatório
sorted(temps) retorna chaves em ordem alfabética. sorted(temps.items()) retorna pares ordenados por chave. Para ordenar as chaves de dias por temperatura, use sorted(temps, key=temps.get), produzindo ['Mon', 'Wed', 'Tue']. Adicione reverse=True para obter ['Tue', 'Wed', 'Mon']. Essas chamadas retornam listas; elas não reorganizam temps.
grades = {"Ana": 88, "Ben": 72, "Cara": 95}
passing = 0
for name, grade in grades.items():
print(f"{name}: {grade}")
if grade >= 75:
passing += 1
O relatório imprime cada nome com sua nota. Ana e Cara atingem o valor limiar, então passing termina em 2.
Remova entradas sem interromper o percurso
Não adicione nem exclua chaves enquanto percorre diretamente um dicionário. Alterar seu tamanho pode lançar RuntimeError: dictionary changed size during iteration. Substituir um valor existente é permitido.
Para remover os dias mais frios, use for day in list(temps): e exclua temps[day] quando seu valor for menor que 70. O laço percorre uma lista separada de chaves, deixando {'Tue': 75, 'Wed': 71} no dicionário. Criar um novo dicionário filtrado é outra maneira de manter o percurso separado das alterações.
Principais conclusões
- Percorra um dicionário para obter chaves,
.values()para valores ou.items()para pares. - Visões refletem alterações; listas oferecem acesso por posição.
key=d.getcompara valores armazenados ao retornar ou ordenar chaves.- A ordenação retorna uma lista e deixa a ordem do dicionário inalterada.
- Percorra uma cópia da lista de chaves ao excluir entradas.
2.2 Crie novos dicionários a partir de dados existentes
Um novo dicionário muitas vezes resulta de uma regra aplicada a dados existentes. Comece com um laço que você consiga explicar e depois use uma compreensão quando a mesma regra couber claramente em uma expressão.
Crie um par por vez
words = ["kiwi", "fig", "banana"]
lengths = {}
for word in words:
lengths[word] = len(word)
Cada passagem escolhe uma palavra como chave e seu comprimento como valor. O resultado é {'kiwi': 4, 'fig': 3, 'banana': 6}. O dicionário é criado antes do laço para que os pares anteriores continuem disponíveis nas passagens posteriores.
Uma compreensão de dicionário expressa o mesmo trabalho:
lengths = {word: len(word) for word in words}
Leia a parte for para ver o que é percorrido e depois a expressão anterior a ela para ver qual par é produzido. Os dois-pontos separam a expressão da chave da expressão do valor. Sem esses dois-pontos, {word for word in words} cria um conjunto.
Mantenha alguns itens
Uma cláusula if filtra a entrada:
grades = {"Ana": 88, "Ben": 72, "Cara": 95}
high_grades = {
name: grade
for name, grade in grades.items()
if grade >= 80
}
Ana e Cara passam no teste, produzindo {'Ana': 88, 'Cara': 95}. O par de Ben fica de fora. O dicionário de entrada permanece inalterado; o resultado contém apenas pares que atendem à condição.
Transforme valores
Uma compreensão pode manter os dias enquanto converte as temperaturas de Fahrenheit para Celsius:
temps = {"Mon": 68, "Tue": 75, "Wed": 71}
celsius = {
day: round((f - 32) * 5 / 9, 1)
for day, f in temps.items()
}
O resultado é {'Mon': 20.0, 'Tue': 23.9, 'Wed': 21.7}. Para terça-feira, subtrair 32 resulta em 43; multiplicar por 5 e dividir por 9 resulta em aproximadamente 23,89. round(..., 1) armazena 23,9. A chave permanece a mesma enquanto o valor muda.
Forme pares de listas com cuidado
dict(zip(names, scores)) forma pares com cada nome e a pontuação na mesma posição. zip para quando a entrada mais curta termina. Formar pares com ["Ana", "Ben", "Cara"] e [90, 85] produz {'Ana': 90, 'Ben': 85}. Nenhum erro informa que a pontuação de Cara está ausente, então verifique os comprimentos das entradas quando cada nome precisar ter uma pontuação.
Troque chaves e valores
favorites = {"Ana": "blue", "Ben": "red", "Cara": "blue"}
by_color = {color: name for name, color in favorites.items()}
O resultado é {'blue': 'Cara', 'red': 'Ben'}. Tanto Ana quanto Cara precisariam da mesma nova chave, então o par posterior de Cara substitui o de Ana. A inversão preserva todos os pares apenas quando os valores antigos são únicos e hasháveis. Um valor do tipo lista não pode se tornar uma chave de dicionário. Para manter vários nomes sob uma cor, armazene uma lista de nomes sob essa cor.
Use um laço comum quando a tarefa exigir várias instruções, mensagens ou verificações. Uma compreensão é útil porque torna uma regra curta visível; comprimir um procedimento maior nela torna a regra mais difícil de acompanhar.
Principais conclusões
- Uma compreensão de dicionário produz um par chave-valor para cada entrada selecionada.
- Uma cláusula
iffiltra; as expressões do par podem transformar os dados. zippara na entrada mais curta.- Inverter um dicionário pode causar perda de entradas quando valores se repetem.
3Conte e agrupe dados com dicionários
Dicionários podem reunir resultados enquanto um laço processa dados. Um contador armazena um número por item distinto; um dicionário de agrupamento armazena vários membros sob cada categoria. Ambos os padrões devem tratar a primeira aparição de uma chave e preservar o que as passagens anteriores acumularam. Depois que os grupos existem, suas listas permitem calcular totais e médias, e recursos da biblioteca padrão podem simplificar a inicialização.
3.1 Conte a frequência de ocorrências
Uma tabela de frequências responde quantas vezes cada item distinto ocorre. Suas chaves identificam os itens; seus valores são contadores. O dicionário cresce quando um novo item aparece, enquanto aparições posteriores aumentam uma contagem existente.
Rastreie um contador
counts = {}
for letter in "banana":
if letter in counts:
counts[letter] += 1
else:
counts[letter] = 1
A primeira letra cria 'b': 1. A seguinte cria 'a': 1 e depois vem 'n': 1. O próximo "a" aumenta sua contagem existente para 2. Após as duas últimas letras, o dicionário é {'b': 1, 'a': 3, 'n': 2}. Sua ordem registra quando cada letra apareceu pela primeira vez, não qual é a mais comum.
Use zero antes da primeira ocorrência
Os dois ramos podem se tornar uma atribuição:
counts = {}
for letter in "banana":
counts[letter] = counts.get(letter, 0) + 1
O lado direito lê a contagem anterior, usando zero quando a chave está ausente, e depois adiciona um. O lado esquerdo armazena essa nova contagem. O próprio get não insere nada; a atribuição é que insere.
Usar apenas counts[letter] += 1 falha quando uma letra é nova. Mover counts = {} para dentro do laço causa outro problema: cada passagem apaga as contagens anteriores. Inicialize uma vez antes de processar os itens.
Decida o que conta como a mesma palavra
Em textos, maiúsculas, minúsculas e pontuação afetam as chaves. As strings "The" e "the" são diferentes, assim como "dog." e "dog". Limpe as formas antes de usá-las como chaves:
text = "The cat saw the dog. The dog ran."
counts = {}
for word in text.lower().split():
word = word.strip(".,!?")
counts[word] = counts.get(word, 0) + 1
Isso produz {'the': 3, 'cat': 1, 'saw': 1, 'dog': 2, 'ran': 1}. lower trata maiúsculas e minúsculas, split separa palavras nos caracteres em branco e strip remove os caracteres de pontuação listados das extremidades. Ele não remove pontuação do meio de uma palavra.
Encontre os itens mais comuns
Para essa tabela não vazia, max(counts, key=counts.get) retorna 'the'. Para encontrar as duas palavras mais comuns, use sorted(counts, key=counts.get, reverse=True)[:2], produzindo ['the', 'dog']. Contagens iguais mantêm sua ordem original na ordenação.
O padrão também conta números ou tuplas. Para os lançamentos [3, 6, 3, 1, 6, 3], ele cria {3: 3, 6: 2, 1: 1}. Um valor nunca observado não tem entrada. Leia-o com valor padrão zero quando isso for útil.
Reconheça o atalho da biblioteca
from collections import Counter
letter_counts = Counter("banana")
print(letter_counts.most_common(1))
print(letter_counts["z"])
Isso imprime [('a', 3)] e depois 0. A importação disponibiliza Counter da biblioteca padrão do Python. Um Counter é um dicionário projetado para contagens: suas chaves são itens hasháveis, e a consulta direta de um item ausente retorna zero. Suas contagens exibidas para essa entrada são Counter({'a': 3, 'n': 2, 'b': 1}).
Principais conclusões
- Uma tabela de frequências associa cada item distinto à sua contagem.
- Inicialize o dicionário antes do laço.
counts[item] = counts.get(item, 0) + 1trata itens novos e repetidos.- Limpe as palavras antes de contá-las quando maiúsculas, minúsculas e pontuação devem ser ignoradas.
- Compare contagens com
key=counts.getpara classificar itens. Countercria contagens e retorna zero em consultas a chaves ausentes.
3.2 Agrupe itens e some valores por categoria
Um dicionário pode armazenar um grupo inteiro sob cada chave. A chave nomeia a categoria, e uma lista contém os itens atribuídos a ela. Isso mantém todos os membros disponíveis para totais, médias ou relatórios posteriores.
Crie listas separadas para grupos
words = ["apple", "bean", "avocado", "beet", "corn"]
groups = {}
for word in words:
first = word[0]
if first not in groups:
groups[first] = []
groups[first].append(word)
Para "apple", o programa cria uma lista vazia sob "a" e acrescenta a palavra. "bean" inicia uma lista "b" separada. "avocado" entra na lista "a" existente. O resultado é {'a': ['apple', 'avocado'], 'b': ['bean', 'beet'], 'c': ['corn']}.
A lista vazia é criada apenas para um novo rótulo. Criá-la em cada passagem descartaria os membros anteriores desse grupo.
Simplifique a inicialização
groups.setdefault(word[0], []).append(word) realiza a mesma etapa de agrupamento. setdefault retorna a lista existente, se houver uma. Caso contrário, armazena a lista vazia fornecida e a retorna. O append seguinte altera essa lista retornada.
Outra opção cria listas automaticamente:
from collections import defaultdict
groups = defaultdict(list)
for word in words:
groups[word[0]].append(word)
Passe list, a função que cria uma nova lista, sem parênteses. Na consulta a uma chave ausente, esse defaultdict cria e armazena uma nova lista vazia. Até mesmo uma leitura como groups["z"] insere essa chave ausente. Use "z" in groups quando quiser apenas verificar se um grupo existe.
Mantenha as listas independentes
groups = dict.fromkeys(["a", "b"], []) coloca a mesma lista sob ambas as chaves. Acrescentar 1 por meio de groups["a"] produz então {'a': [1], 'b': [1]}. As listas são compartilhadas, não copiadas.
Para começar com listas separadas, use {key: [] for key in keys}, setdefault com uma nova [] ou defaultdict(list). Cada nova categoria deve receber seu próprio objeto de lista.
Some valores por categoria
A contagem adiciona um por ocorrência. Um total por categoria adiciona o valor de cada item:
expenses = [("food", 12.5), ("travel", 30),
("food", 7.25), ("books", 18)]
totals = {}
for category, amount in expenses:
totals[category] = totals.get(category, 0) + amount
Alimentação começa em 12,5 e depois recebe 7,25, terminando em 19,75. Viagem totaliza 30 e livros totalizam 18. Armazenar apenas amount substituiria o total anterior em vez de somar a ele.
Calcule a média ou remova duplicatas de um grupo
Para scores = {"A": [80, 90], "B": [70]}, percorra scores.items() e calcule sum(values) / len(values). O grupo A tem média 85,0; o grupo B tem média 70,0. Teste if values: antes de dividir para que um grupo vazio seja tratado separadamente.
Quando as repetições devem desaparecer dentro de cada grupo, use conjuntos como valores. tags.setdefault(post, set()).add(tag) cria um conjunto para uma nova publicação e adiciona sua etiqueta. Uma etiqueta repetida permanece como um elemento; uma lista manteria cada ocorrência.
Principais conclusões
- O agrupamento associa uma categoria a seus membros, frequentemente em uma lista.
- Crie uma nova lista para cada grupo.
setdefaultedefaultdict(list)simplificam a inicialização de grupos.- Totais por categoria somam valores; médias dividem a soma de cada grupo por sua própria contagem.
- Use conjuntos como valores dos grupos quando membros repetidos devem desaparecer.
4Modele dados estruturados com dicionários aninhados
Campos relacionados ficam juntos em um registro, e vários registros podem ser organizados por ID ou mantidos como linhas em uma lista. Acessar o valor correto significa passar por cada nível em ordem. Relatórios combinam um laço externo de registros com consultas a campos ou um laço interno sobre uma lista armazenada. Campos opcionais ausentes, listas vazias e objetos internos compartilhados afetam a forma como esses registros devem ser lidos, resumidos ou copiados.
4.1 Armazene e acesse registros em dicionários aninhados
Um registro reúne campos relacionados, como idade, área de estudo e notas de um estudante. Um dicionário aninhado armazena outro dicionário como valor. As chaves externas podem identificar registros, enquanto as internas identificam campos.
Leia um nível por vez
students = {
"ana": {"age": 19, "major": "math", "grades": [88, 92]},
"ben": {"age": 22, "major": "history", "grades": [75, 81, 79]},
}
students["ana"] fornece o dicionário de registro de Ana. Adicionar ["major"] lê sua área de estudo, então students["ana"]["major"] retorna 'math'. Para a nota mais recente de Ben, students["ben"]["grades"][-1] acessa o registro, depois sua lista e, então, o último elemento da lista, 79.
Cada consulta atua sobre o objeto retornado pela consulta anterior. A mesma sintaxe de colchetes pode significar uma chave de dicionário em um nível e uma posição de lista em outro.
Altere um campo ou adicione um registro
students["ana"]["age"] = 20
students["ben"]["email"] = "ben@example.com"
students["cara"] = {"age": 21, "major": "art", "grades": []}
students["cara"]["grades"].append(90)
As duas primeiras linhas alteram ou adicionam campos dentro de registros existentes. A terceira adiciona um registro inteiro sob um novo ID. A quarta acessa a lista de notas de Cara e acrescenta uma nota a ela.
Atribuir students["dev"]["age"] = 30 falha porque a consulta externa de "dev" ocorre primeiro e lança KeyError: 'dev'. Crie o registro antes de atribuir seus campos.
Para uma leitura opcional, students.get("dev", {}).get("age") retorna None. O primeiro valor padrão é um dicionário vazio, então o segundo get tem um dicionário para ler mesmo quando o registro está ausente. Para esses registros, cada valor externo é um dicionário.
Escolha uma estrutura adequada ao acesso
Uma lista de dicionários mantém as linhas em ordem:
rows = [{"name": "Ana", "city": "Austin"},
{"name": "Ben", "city": "Denver"}]
print(rows[1]["city"])
Isso imprime Denver: primeiro o índice da lista, depois a chave do campo. Um dicionário de listas, como {"A": [80, 90], "B": [70]}, armazena vários valores por rótulo. Essas estruturas podem ser combinadas quando um registro precisa tanto de campos nomeados quanto de uma lista ordenada.
Quando nomes identificam linhas de forma única, crie by_name = {row["name"]: row for row in rows}. Então by_name["Ben"] encontra diretamente a linha de Ben. Os valores são os dicionários de linha existentes, então edições por meio desse índice também afetam essas linhas. Se nomes se repetirem, uma linha posterior substituirá uma anterior sob essa chave.
Copie dados aninhados de forma consciente
backup = students compartilha o dicionário inteiro. backup = students.copy() cria um dicionário externo separado, mas mantém os mesmos registros internos. Após essa cópia superficial, backup["ana"]["age"] = 99 também altera a idade de Ana em students.
import copy
independent = copy.deepcopy(students)
independent["ana"]["age"] = 25
Para esses dicionários e listas aninhados, a cópia profunda também cria objetos internos separados. Alterar a idade na cópia deixa a idade original inalterada. Use nomes de campo consistentes entre os registros para que o mesmo código de consulta funcione em cada um.
Principais conclusões
- Consultas encadeadas passam por uma coleção por vez.
- Crie um dicionário interno antes de atribuir um campo dentro dele.
- Uma lista de registros usa primeiro um índice; um dicionário de registros usa um ID.
- Uma cópia superficial compartilha registros internos; uma cópia profunda separa dados mutáveis aninhados.
4.2 Percorra e resuma dados aninhados
Processar dados aninhados significa acompanhar o nível alcançado pelo laço. Um laço externo escolhe um registro. Uma consulta a campo acessa um valor dentro desse registro, e um laço interno pode então percorrer os elementos de uma lista armazenada.
Resuma um registro por passagem
students = {
"ana": {"major": "math", "grades": [88, 92]},
"ben": {"major": "history", "grades": [75, 81, 79]},
"cara": {"major": "art", "grades": []},
}
for name, info in students.items():
grades = info["grades"]
major = info["major"]
if grades:
average = sum(grades) / len(grades)
print(f"{name}: {major}, average {average:.1f}")
else:
print(f"{name}: {major}, no grades")
As notas de Ana somam 180, então sua média é 90,0. O total de Ben é 235 em três notas, resultando em aproximadamente 78,33; o formato :.1f exibe 78,3. A lista de Cara está vazia, então o programa imprime cara: art, no grades sem dividir por zero.
Atribuir valores a grades e major dentro do laço faz cada nome receber os valores do registro atual. A média também pertence ao laço: ela deve ser calculada separadamente para cada estudante.
Leia campos opcionais
info.get("email", "no email") fornece texto para um campo opcional de e-mail. Uma consulta direta info["email"] lançaria KeyError para um registro sem esse campo. Um valor padrão deve ficar no nível em que o campo pode estar ausente. O get do dicionário externo procuraria IDs de estudantes, não campos de e-mail.
Selecione registros
math_students = []
for name, info in students.items():
if info["major"] == "math":
math_students.append(name)
Isso produz ['ana']. A condição lê um campo do registro atual; o valor acrescentado é a chave externa. Se o relatório precisasse de registros inteiros, poderia acrescentar info. Decida de qual tipo de resultado a próxima parte do programa precisa.
Percorra cada nota armazenada
count = 0
for info in students.values():
for grade in info["grades"]:
if grade > 80:
count += 1
O laço interno percorre 88 e 92 de Ana, depois 75, 81 e 79 de Ben. A lista vazia de Cara não acrescenta passagens. Três notas são superiores a 80: 88, 92 e 81. A contagem é inicializada fora dos dois laços porque descreve todos os estudantes em conjunto. Reiniciá-la dentro do laço externo manteria apenas a contagem do último registro.
Conte registros por um campo
majors = {}
for info in students.values():
major = info["major"]
majors[major] = majors.get(major, 0) + 1
Cada registro acrescenta um à contagem de sua área de estudo. Apenas para Ana e Ben, o resultado é {'math': 1, 'history': 1}; incluir Cara adiciona 'art': 1. Para totalizar ou agrupar por outro campo, mantenha o laço externo de registros e altere o valor com que cada registro contribui.
Para relatórios legíveis, imprima uma linha formatada por registro em vez do dicionário aninhado inteiro. Em uma f-string, primeiro armazene um campo em uma variável, como acima, ou use o estilo oposto de aspas dentro das chaves, como em f"{name}: {info['major']}".
Principais conclusões
- Um laço externo escolhe um registro; consultas a campos atuam dentro dele.
- Verifique se uma lista está vazia antes de dividir por seu comprimento.
- Use
getno registro para um campo opcional. - Um laço interno percorre cada elemento da lista de um registro.
- Coloque um acumulador fora dos laços cujos resultados ele combina.
5Use conjuntos para remover duplicatas e comparar coleções
Conjuntos se concentram em quais valores estão presentes. Remover duplicatas e comparar pertencimento tornam-se operações diretas, desde encontrar estudantes matriculados em ambos os cursos até verificar habilidades ausentes. Ordem e ocorrências repetidas exigem outras coleções, então a escolha importa antes de converter os dados. Conjuntos também se relacionam com dicionários: suas chaves podem ser comparadas como conjuntos mesmo quando os valores armazenados diferem.
5.1 Crie conjuntos e remova duplicatas
Um conjunto registra quais valores distintos estão presentes. Ele mantém cada elemento uma vez e não tem ordem garantida. Conjuntos são adequados para testes de pertencimento e para remover duplicatas quando o número de ocorrências não importa.
Crie um conjunto
colors = {"red", "green"}
numbers = set([3, 1, 3, 2, 1])
print(len(numbers))
print(sorted(numbers))
Isso imprime 3 e depois [1, 2, 3]. Entradas repetidas tornam-se um único elemento. Um conjunto vazio é set(); {} cria um dicionário vazio.
set("banana") percorre os caracteres da string, deixando as letras distintas "a", "b" e "n". {"banana"} fornece a string inteira como um único elemento. Assim como nas chaves de dicionário, valores numéricos iguais contam uma vez: {1, 1.0, True} tem um elemento.
Os elementos devem ser hasháveis. Números, strings e tuplas de valores hasháveis funcionam; listas, dicionários e conjuntos comuns não. Use (1, 2) como elemento de coordenadas em vez de [1, 2]. Um frozenset é um conjunto imutável e pode ser elemento de conjunto ou chave de dicionário.
Trabalhe sem posições
colors[0] lança TypeError porque um conjunto não tem posições. Sua ordem de impressão não é garantida, e elementos do tipo string podem ser impressos em outra ordem em uma execução diferente. sorted(colors) produz uma nova lista ordenada quando os elementos podem ser comparados. Isso não atribui uma ordem ao conjunto.
Altere os elementos
| Operação | O que acontece |
|---|---|
s.add(x) | Adiciona um elemento; uma duplicata não tem efeito. |
s.update(items) | Adiciona elementos de um iterável. |
s.remove(x) | Remove x; um elemento ausente lança KeyError. |
s.discard(x) | Remove x se estiver presente; a ausência é permitida. |
s.pop() | Remove e retorna um elemento arbitrário. |
s.clear() | Remove todos os elementos. |
add("blue") adiciona uma string. update(["blue", "gold"]) adiciona duas strings. Usar update("blue") adiciona caracteres separados, pois uma string é iterável. Conjuntos não têm o método append.
Preserve as primeiras ocorrências quando necessário
list(set(items)) remove duplicatas, mas perde sua ordem original. Se as primeiras ocorrências importarem, use a ordem de inserção de dicionários:
items = [3, 1, 3, 2, 1]
unique = list(dict.fromkeys(items))
print(unique)
Isso imprime [3, 1, 2]. Os valores tornam-se chaves de dicionário, então cada um aparece uma vez na ordem em que foi encontrado pela primeira vez.
Você também pode deixar as funções explícitas:
seen = set()
unique = []
for item in items:
if item not in seen:
seen.add(item)
unique.append(item)
O conjunto responde se um item já apareceu; a lista mantém as primeiras ocorrências em ordem. Ambas as formas exigem itens de entrada hasháveis.
Conte itens distintos ou verifique o pertencimento
Para as oito palavras em "the cat saw the dog the dog ran".split(), len(set(words)) é 5: the, cat, saw, dog e ran. Isso conta palavras diferentes, não suas frequências.
Um conjunto de remetentes bloqueados permite que sender in blocked responda se um endereço está presente. Para coleções grandes, testar o pertencimento em conjuntos e dicionários geralmente é muito mais rápido do que procurar em uma lista, um item por vez.
Principais conclusões
- Um conjunto armazena elementos hasháveis únicos sem ordem garantida.
- Use
set()para um conjunto vazio;{}é um dicionário. removelança uma exceção quando o elemento está ausente;discardpermite a ausência.sorted(s)retorna uma lista; elementos de conjunto não têm posições.list(dict.fromkeys(items))remove repetições mantendo as primeiras ocorrências.len(set(items))conta valores distintos.
5.2 Compare coleções com operações de conjuntos
Operações de conjuntos expressam perguntas sobre o pertencimento a duas coleções. Use a operação que corresponde à pergunta: qualquer pessoa em uma das coleções, apenas membros compartilhados ou membros restantes após exclusões.
Entenda as quatro operações
Suponha que as matrículas nos cursos sejam:
python = {"Ana", "Ben", "Cara", "Dev"}
sql = {"Ben", "Dev", "Eli"}
| Expressão | Regra de pertencimento | Membros, em ordem alfabética |
|---|---|---|
| `python | sql` | Em um conjunto ou em ambos |
python & sql | Em ambos os conjuntos | Ben, Dev |
python - sql | Em Python, mas não em SQL | Ana, Cara |
python ^ sql | Em exatamente um conjunto | Ana, Cara, Eli |
A união inclui os cinco estudantes uma vez. A interseção mantém apenas os dois estudantes compartilhados. A diferença começa pelo conjunto à esquerda e exclui tudo que está no conjunto à direita. Inverter a diferença muda a pergunta: sql - python contém apenas Eli. A diferença simétrica mantém as duas partes sem sobreposição; ela equivale à união menos a interseção.
As formas nomeadas são python.union(sql), python.intersection(sql), python.difference(sql) e python.symmetric_difference(sql).
Teste uma relação
a <= b pergunta se cada membro de a pertence a b. Esse é o teste de subconjunto. a < b também exige que b tenha pelo menos um membro adicional, fazendo de a um subconjunto próprio. a >= b e a > b testam as relações correspondentes de superconjunto.
print({"Ben"} <= sql)
print(sql <= sql)
print(sql < sql)
print(python.isdisjoint(sql))
Isso imprime True, True, False e False. Um conjunto é subconjunto de si mesmo, mas não é subconjunto próprio de si mesmo. Conjuntos disjuntos não têm membros compartilhados; Python e SQL compartilham Ben e Dev. As formas de método issubset e issuperset também retornam resultados booleanos.
Mantenha resultados separados ou altere um conjunto
result = a | b cria um novo conjunto, deixando ambas as entradas inalteradas. As formas que operam no próprio objeto, a |= b, a &= b, a -= b e a ^= b, alteram a para a união, interseção, diferença ou diferença simétrica. Qualquer outro nome que se refira ao mesmo conjunto vê a alteração.
Métodos nomeados de conjuntos aceitam iteráveis como listas. python.union(["Fay"]) funciona. Os operadores comuns de conjuntos exigem operandos do tipo conjunto: {"a"} | ["b"] lança TypeError.
Use | para combinar conjuntos, não +. Distinga também & de and: {1, 2} and {3} retorna {3} porque o conjunto à esquerda é considerado verdadeiro. Isso não calcula os membros comuns.
Encontre requisitos ausentes
required = {"python", "sql", "git"}
skills = {"python", "excel", "git"}
missing = required - skills
extra = skills - required
qualified = required <= skills
O conjunto de habilidades ausentes contém "sql"; o conjunto de habilidades adicionais contém "excel". A interseção contém "git" e "python". qualified é False, pois pelo menos uma habilidade exigida está ausente. Uma pessoa candidata pode ter muitas habilidades e ainda falhar no teste de subconjunto: todos os elementos específicos exigidos devem estar presentes.
Principais conclusões
|reúne elementos de um conjunto ou de ambos,&mantém os comuns e^mantém os que estão em exatamente um.a - bmantém apenas membros deaque estão ausentes deb.<=permite conjuntos iguais;<exige um subconjunto próprio.isdisjointtesta se não há membros compartilhados.- Operadores comuns de conjuntos criam resultados; as formas que operam no próprio objeto alteram o conjunto à esquerda.
5.3 Escolha a coleção adequada para uma tarefa
Escolha uma coleção de acordo com o trabalho que o programa deve fazer com ela. Ordem, repetições, consulta por nome e possibilidade de alteração são necessidades distintas. Um programa pode usar vários tipos de coleção porque diferentes partes de seus dados servem a tarefas diferentes.
Compare as coleções embutidas
| Tipo | Como você acessa os dados | Ordem e repetições | A coleção pode ser alterada? |
|---|---|---|---|
| Lista | Por posição | Ordenada; permite repetições | Sim |
| Tupla | Por posição | Ordenada; permite repetições | Não |
| Dicionário | Por chave | Ordem de inserção; chaves únicas | Sim |
| Conjunto | Por pertencimento | Sem ordem garantida; elementos únicos | Sim |
Uma lista é adequada para uma sequência de eventos: a ordem importa, e o mesmo evento pode ocorrer mais de uma vez. Uma tupla é adequada para um grupo fixo de valores relacionados, como coordenadas. Uma tupla pode conter um objeto mutável, então suas posições fixas não tornam imutável todo objeto contido nela. Apenas uma tupla de itens hasháveis pode ser chave de dicionário ou elemento de conjunto.
Um dicionário é adequado para informações nomeadas: um ID leva a um registro ou um nome de produto leva a uma quantidade. Seus valores podem se repetir e ser coleções inteiras. Um conjunto é adequado para uma pergunta de pertencimento: o programa precisa saber se um ID está presente, não de um valor separado para ele.
Preserve as informações necessárias à tarefa
Converter [1, 2, 1] em um conjunto perde tanto a ocorrência repetida quanto a sequência. Isso é útil para uma lista de itens distintos, mas inadequado para um registro completo de eventos. Um dicionário como {"reader": True, "editor": True} muitas vezes pode se tornar {"reader", "editor"} quando os valores não trazem informações adicionais. Se cada função precisar de um nível de permissão, mantenha o dicionário.
A igualdade segue o significado de cada coleção. [1, 2] == [2, 1] é False, pois a ordem da sequência é diferente. {1, 2} == {2, 1} é True. Dicionários com pares chave-valor iguais são considerados iguais mesmo que as chaves tenham sido inseridas em ordens diferentes. Sua ordem de inserção afeta o percurso, não esse teste de igualdade.
Compare chaves de dicionários como conjuntos
store_a = {"pens": 10, "pads": 4, "ink": 2}
store_b = {"pads": 7, "clips": 30, "ink": 5}
common = store_a.keys() & store_b.keys()
only_a = store_a.keys() - store_b.keys()
As chaves comuns são "ink" e "pads"; only_a contém "pens". Esses são os produtos vendidos, independentemente de suas quantidades. As duas lojas têm quantidades diferentes de tinta, mas tinta ainda é uma chave compartilhada.
Visões de chaves de dicionário aceitam operações de conjuntos porque as chaves são únicas e hasháveis. Visões de valores não aceitam esses operadores: store_a.values() & {1} lança TypeError. É possível converter valores em um conjunto quando são hasháveis, mas isso descarta valores repetidos e responde a uma pergunta diferente da comparação de chaves de produtos.
Combine estruturas em um programa
Uma biblioteca pode usar um dicionário que associa IDs de livros a dicionários de registros, um conjunto de IDs atualmente emprestados e uma lista dos empréstimos de hoje em ordem de horário. Uma tupla como ("Dune", 1965) mantém juntos um título e um ano. O dicionário encontra os detalhes de um livro; o conjunto verifica a situação do empréstimo; a lista preserva o histórico do dia.
Principais conclusões
- Use dicionários para consultas por nome ou ID e conjuntos para verificar o pertencimento de valores distintos.
- Use listas para sequências ordenadas e mutáveis e tuplas para grupos fixos.
- A igualdade de listas depende da ordem; a de dicionários e conjuntos não.
- Operações de conjuntos em visões de chaves comparam as chaves, não os valores armazenados sob elas.
Exercícios resolvidos de Dicionários e conjuntos em Python
1Crie e mantenha um dicionário de estoque
14 passos
- 1IntroduçãoEncontre informações por nome
Um estoque precisa associar o nome de um produto à sua quantidade. Um dicionário armazena essa relação como um par chave-valor: o nome é a chave, e a quantidade é o valor.
Você criará um pequeno estoque, decidirá o que significa um produto ausente e rastreará alterações em produtos existentes e novos. Acompanhe duas coisas separadamente: se uma chave existe e qual valor ela armazena.
- 2ExemploEscreva o estoque inicial
stock = {"pens": 10, "pads": 4}Cada dois-pontos liga uma chave a seu valor, e a vírgula separa os pares.
stock["pens"]lê10;len(stock)é2, o número de pares.A chave identifica o produto.
stock[0]procuraria a chave0, não o primeiro produto. Embora dicionários preservem a ordem de inserção, suas entradas continuam sendo acessadas por chaves. - 3ExplicaçãoEscolha chaves que o Python pode armazenar
As chaves devem ser hasháveis. Strings e números funcionam, assim como tuplas que contêm apenas itens hasháveis. Uma localização como
(2, 3)pode ser uma chave, enquanto a lista[2, 3]não pode.Os valores podem ser de qualquer tipo, incluindo listas ou dicionários. Essa regra se aplica à chave, então armazenar uma lista como valor não impede que o par seja válido.
- 4DesafioConte os pares armazenados
Qual é o comprimento de
{"pens": 10, "pads": 4, "pens": 7}e qual valor está armazenado para"pens"?---reveal---
O comprimento é
2, e canetas tem o valor7. O par posterior substitui o valor anterior sob a mesma chave. Ele não cria uma segunda entrada para canetas. Chaves diferentes podem compartilhar um valor, mas uma chave não pode conter dois pares separados. - 5ExplicaçãoDecida o que a ausência significa
stock["clips"]lançaKeyErrorporque o estoque atual não tem uma chave para clipes. Use a consulta direta quando um registro for obrigatório e um registro ausente exigir atenção.stock.get("clips", 0)retorna a alternativa zero sem adicionar clipes. Isso é adequado a um cálculo em que um produto ausente deve contar como estoque armazenado igual a zero. O dicionário ainda tem duas entradas após essa chamada. - 6Ideia-chaveUm zero armazenado ainda tem uma chave
Suponha que
stock["pads"] = 0registre que os blocos estão esgotados."pads" in stockainda éTrue, pois o registro existe.if stock.get("pads"):ignora o ramo porque zero é falso. Esse teste não consegue distinguir um produto esgotado de um registro ausente que retornaNone. Quando a pergunta for se um registro existe, teste a chave comin. - 7DesafioMantenha visíveis os produtos esgotados
Começando com
stock = {"pens": 10, "pads": 0}, um relatório deve mostrar a quantidade de blocos e imprimir"missing"para um produto ausente. Qual teste deve decidir sestock[item]será lido?---reveal---
Use
if item in stock:. Blocos passa nesse teste e exibe zero. No ramoelse, imprima"missing". Um teste do valor lógico da quantidade retornada trataria incorretamente o registro do produto esgotado como ausente. - 8ExemploRegistre uma venda e uma entrega
Comece um novo estoque:
stock = {"pens": 10, "pads": 4} stock["pens"] -= 3 stock["clips"] = 50A venda lê a quantidade anterior de canetas e armazena
7. A entrega cria uma nova chave para clipes com valor50. A linha com-=exige que canetas já exista; uma atribuição simples pode criar uma chave ausente. Um dicionário não tem o métodoappend. - 9ExemploRecupere uma quantidade removida
Continue com o estoque:
removed = stock.pop("pads")removedpassa a ser4, e o dicionário passa a ser{"pens": 7, "clips": 50}.popaltera a coleção e também retorna o valor removido.Use
del stock["pads"]quando precisar apenas da remoção. Ambas as formas lançamKeyErrorem caso de ausência, a menos quepopreceba um valor padrão, como emstock.pop("pads", 0). - 10DesafioTrate uma segunda remoção
O estoque atual é
{"pens": 7, "clips": 50}. O questock.pop("pads", 0)retorna e o que acontece com o estoque?---reveal---
Ele retorna
0e deixa o estoque inalterado, pois blocos já está ausente. O valor padrão evita um erro de chave ausente; ele não cria um par para blocos. Uma chave existente seria removida e seu valor armazenado seria retornado. - 11ExplicaçãoMescle configurações sem perder a base
Para dois dicionários,
base | overridescria um novo resultado e faz o lado direito prevalecer nas chaves comuns:base = {"size": 2, "color": "blue"} result = base | {"size": 5}resulttem tamanho5e cor"blue";baseainda tem tamanho2. Esse operador está disponível desde o Python 3.9.base.update(overrides)alteraria a base e retornariaNone. - 12DicaAcompanhe a ordem durante as alterações
Substituir um valor mantém sua chave na posição. Excluir uma chave e adicioná-la novamente a coloca no final.
popitem()remove o par inserido mais recentemente, não o maior valor.Distinga também os valores de retorno dos métodos:
update()eclear()retornamNone, enquantopop()retorna um valor. Não atribua o resultado de uma atualização de volta ao nome de que você precisa para o dicionário. - 13DesafioUse um valor padrão sem sobrescrever
Um programa começa com
stock = {"pens": 7}. Ele chamastock.get("clips", 20), depoisstock.setdefault("clips", 5)e então adiciona2astock["clips"]. Qual é a quantidade final de clipes?---reveal---
É
7.getretorna20, mas não insere nada.setdefaultcria então clipes com5, e a atualização final adiciona2. Um valor padrão de consulta não é um valor armazenado, a menos que uma operação realmente o insira. - 14RecapitulaçãoAcompanhe a chave e o valor
Crie um dicionário a partir de pares chave-valor e depois escolha conscientemente o comportamento da consulta: acesso direto para registros obrigatórios,
inpara existência egetpara uma alternativa.Atribuições adicionam ou substituem. Métodos de remoção podem retornar dados úteis, e a mesclagem pode criar um novo dicionário ou alterar um existente. Ao rastrear código, registre cada inserção, substituição de valor e exclusão em ordem.
2Transforme dados de dicionário em relatórios
12 passos
Salve esta aula para seguir cada Lição Interativa passo a passo.
- 1IntroduçãoEscolha o que cada laço recebe
- 2ExemploReceba as duas partes de um par
- 3Ideia-chaveUma visão permanece conectada
- 4ExemploOrdene por um valor armazenado
- 5DesafioMantenha nomes em ordem de valor
- 6ExemploCrie um dicionário com um laço
- 7ConexãoExpresse a mesma regra de forma compacta
- 8ExemploFiltre primeiro e depois produza o par
- 9DesafioCombine um filtro e uma transformação
- 10DicaVerifique os pares antes de criar o dicionário
- 11DesafioRemova entradas com valores baixos sem interromper o laço
- 12RecapitulaçãoCombine a entrada com o resultado
3Crie contagens, grupos e totais por categoria
13 passos
Salve esta aula para seguir cada Lição Interativa passo a passo.
- 1IntroduçãoDeixe cada categoria acumular um resultado
- 2ExemploDê a um novo item sua primeira contagem
- 3ExemploUse zero para um item ainda não encontrado
- 4DesafioDescubra por que uma contagem nunca aumenta
- 5DicaLimpe antes de escolher a chave
- 6ExplicaçãoMantenha os membros de cada grupo
- 7ExemploRastreie uma atualização de valor do tipo lista
- 8Ideia-chaveCada grupo precisa de uma lista separada
- 9DesafioPreveja um novo grupo automático
- 10ExemploSome valores em vez de ocorrências
- 11ExemploCalcule a média dos valores de cada grupo
- 12DesafioEscolha com o que cada registro contribui
- 13RecapitulaçãoPreserve o resultado entre as passagens
4Leia e resuma registros aninhados
11 passos
Salve esta aula para seguir cada Lição Interativa passo a passo.
- 1IntroduçãoSepare IDs de registros dos campos
- 2ExemploSiga o caminho até uma nota
- 3DesafioAdicione um campo a um novo registro
- 4Ideia-chaveCopiar a parte externa pode compartilhar a interna
- 5DesafioMantenha independentes as notas de teste
- 6ExemploCalcule uma média por registro
- 7DicaTrate um registro sem notas
- 8ConexãoLeia campos no nível do registro
- 9ExemploPercorra todas as notas dos registros
- 10DesafioCombine um campo e uma lista armazenada
- 11RecapitulaçãoMantenha cada nível visível
5Compare o pertencimento e escolha coleções
15 passos
Salve esta aula para seguir cada Lição Interativa passo a passo.
- 1IntroduçãoPergunte quem pertence a cada coleção
- 2ExplicaçãoCrie uma coleção de membros únicos
- 3DicaAdicione e remova o elemento desejado
- 4ExemploPreserve as primeiras ocorrências
- 5DesafioMantenha a sequência original de rótulos distintos
- 6ExemploEncontre todos ou apenas os estudantes em comum
- 7ExemploLeia a diferença da esquerda para a direita
- 8DesafioEncontre pessoas em exatamente um clube
- 9ExplicaçãoVerifique todos os requisitos
- 10Ideia-chaveDistinga um resultado de um conjunto alterado
- 11ConexãoMantenha histórico, identidade e pertencimento
- 12ExemploCompare chaves sem comparar quantidades
- 13DesafioEscolha uma coleção para um registro crescente
- 14DesafioCombine visões de chaves com uma verificação de registro ausente
- 15RecapitulaçãoEscolha primeiro a pergunta de pertencimento
Questões de Dicionários e conjuntos em Python
Conjunto 1: Leia e altere coleções Python10 Questões de Prática
Questão 1 de 10
{"oak": 4, "pine": 7, "oak": 9}?Mostrar respostaOcultar resposta
"oak" mantém seu último valor, 9, então o dicionário tem as duas chaves "oak" e "pine". Contar os três pares escritos desconsidera a substituição: um dicionário não pode conter duas entradas separadas sob a mesma chave. O número de itens é o número de chaves distintas.Questão 2 de 10
levels = {"east": 0, "west": 5}, o que "east" in levels retorna?Mostrar respostaOcultar resposta
"east" é uma chave, e ela está presente com o valor armazenado zero. Um valor zero torna falso um teste do valor lógico, mas não remove a chave. O resultado de in é um booleano, não o valor armazenado sob a chave.Questão 3 de 10
O que este código imprime?
seats = {"front": 6, "back": 8}
removed = seats.pop("front")
seats["back"] -= 2
print(removed, seats["back"])
Mostrar respostaOcultar resposta
pop("front") remove o par e retorna seu valor, então removed passa a ser 6. A contagem restante de assentos traseiros cai de 8 para 6. Tratar pop como um método que retorna None é confundi-lo com métodos como clear, que alteram uma coleção sem retornar um item.Questão 4 de 10
sum({"small": 3, "large": 9}.values()) retorna?Mostrar respostaOcultar resposta
3 e 9, e sum os soma para produzir 12. Os dois pares chave-valor não fazem a soma ser 2; esse seria o comprimento do dicionário. Chamar .values() seleciona as quantidades necessárias ao cálculo.Questão 5 de 10
{name: len(name) for name in ["elm", "cedar"]} cria?Mostrar respostaOcultar resposta
len(name) fornece o valor correspondente: 3 para "elm" e 5 para "cedar". Inverter os pares exigiria a expressão do comprimento antes dos dois-pontos e a expressão do nome depois deles.Questão 6 de 10
Qual é o valor de counts["up"] após este laço?
counts = {}
for move in ["up", "left", "up", "up"]:
counts[move] = counts.get(move, 0) + 1
Mostrar respostaOcultar resposta
"up" armazena 1, o segundo aumenta para 2 e o terceiro aumenta para 3. A entrada "left" tem seu próprio contador e não aumenta "up". Contar todas as quatro passagens do laço daria o número total de movimentos, não a frequência desse movimento específico.Questão 7 de 10
Qual é o valor de groups["r"] após este código?
groups = {}
for word in ["rose", "mint", "reed"]:
groups.setdefault(word[0], []).append(word)
Mostrar respostaOcultar resposta
"r" e acrescenta "rose"; "reed" depois entra nessa mesma lista. O grupo "m" contém "mint" separadamente. setdefault preserva uma lista existente, então não a substitui por uma nova lista vazia na última passagem.Questão 8 de 10
devices = {"d7": {"ports": [2, 4, 8]}}, o que devices["d7"]["ports"][-1] retorna?Mostrar respostaOcultar resposta
[-1] seleciona o último elemento da lista, 8. Uma chave de dicionário e um índice de lista desempenham funções diferentes na cadeia. O comprimento da lista é 3, mas a expressão pede um elemento, não seu comprimento.Questão 9 de 10
len(set([8, 2, 8, 5, 2])) retorna?Mostrar respostaOcultar resposta
8, 2 e 5. Aparições repetidas não criam novos elementos, então o comprimento é 3. A lista de entrada tem cinco posições, mas convertê-la em um conjunto descarta as ocorrências extras antes de len ser avaliado.Questão 10 de 10
{"read", "write"}. Uma conta tem {"read", "share"}, e uma nova concessão adiciona {"write"}. Qual expressão testa se a conta atende a todos os requisitos após a concessão?Mostrar respostaOcultar resposta
Conjunto 2: Rastreie consultas, grupos e registros10 Questões de Prática
Salve esta aula para ver todas as respostas e praticar cada conjunto.
Questão 1 de 10
rates = {"basic": 7} e result = rates.get("plus", 0), quais são os valores de result e len(rates)?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 2 de 10
O que este código imprime?
settings = {"sound": 2, "light": 4}
settings.update({"sound": 5})
del settings["sound"]
settings["sound"] = 1
print(list(settings))
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 3 de 10
wait = {"A": 9, "B": 3, "C": 6}, o que sorted(wait, key=wait.get) retorna?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 4 de 10
O que este código imprime?
from collections import Counter
counts = Counter([4, 4, 7])
print(counts[9])
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 5 de 10
O que este código imprime?
groups = dict.fromkeys(["indoor", "outdoor"], [])
groups["indoor"].append(12)
groups["outdoor"].append(18)
print(groups["indoor"])
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 6 de 10
O que este código imprime?
original = {"r1": {"visits": 2}}
backup = original.copy()
backup["r1"]["visits"] += 3
backup["r2"] = {"visits": 1}
print(original["r1"]["visits"], "r2" in original)
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 7 de 10
{"scores": []}. Qual condição deve proteger sum(scores) / len(scores) após scores = record["scores"]?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 8 de 10
"paused" de states permitindo que ele esteja ausente?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 9 de 10
morning = {"Ivo", "June", "Kai"} e evening = {"June", "Mina"}, quais são os membros de morning ^ evening?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 10 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Conjunto 3: Depure transformações de coleções10 Questões de Prática
Salve esta aula para ver todas as respostas e praticar cada conjunto.
Questão 1 de 10
len({1: "first", True: "second", "1": "third"})?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 2 de 10
"missing" quando a chave do produto estiver ausente. Qual corpo de função atende a esse requisito?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 3 de 10
Qual dicionário resulta desta inversão?
team = {"Luz": "design", "Omar": "support", "Pia": "design"}
by_role = {role: name for name, role in team.items()}
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 4 de 10
"Go go! Stop." usando lower().split() e word.strip(".,!?"), qual é a contagem de "go"?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 5 de 10
[("repair", 14), ("delivery", 6), ("repair", 9)]. Com totals[category] = totals.get(category, 0) + amount, qual é o valor de totals["repair"]?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 6 de 10
records.get("x9", {}).get("email", "none") retorna quando "x9" está ausente?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 7 de 10
O que este código imprime?
records = {"a": {"scores": [6, 9]}, "b": {"scores": [8]},
"c": {"scores": []}}
count = 0
for info in records.values():
for score in info["scores"]:
if score >= 8:
count += 1
print(count)
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 8 de 10
list(dict.fromkeys(["z", "m", "z", "a"])) retorna?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 9 de 10
{2, 5} < {2, 5} retorna?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 10 de 10
O que este código imprime?
first = {"lamp": 4, "cord": 9, "plug": 2}
second = {"cord": 3, "plug": 8, "case": 5}
result = {name: first[name]
for name in first.keys() & second.keys()
if first[name] < second[name]}
print(sorted(result.items()))
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Conjunto 4: Combine habilidades com coleções10 Questões de Prática
Salve esta aula para ver todas as respostas e praticar cada conjunto.
Questão 1 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 2 de 10
O que este código imprime?
stock = {"bolts": 0}
first = stock.get("nuts", 4)
second = stock.setdefault("nuts", 6)
print(first, second, len(stock))
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 3 de 10
O que este código imprime?
base = {"size": 2, "mode": 1}
alias = base
merged = base | {"size": 5}
alias["mode"] = 3
print(merged["size"], merged["mode"], base["size"])
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 4 de 10
O que este código imprime?
levels = {"low": 2, "high": 8, "mid": 5}
view = levels.keys()
for name in list(levels):
if levels[name] < 5:
del levels[name]
print(list(view))
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 5 de 10
O que este código produz?
names = ["Rae", "Sol", "Tia"]
scores = [7, 9]
result = {name: score * 2 for name, score in zip(names, scores)
if score >= 8}
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 6 de 10
O que este código imprime?
from collections import defaultdict
groups = defaultdict(list)
groups["red"].append(5)
unused = groups["blue"]
print(len(groups), len(unused))
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 7 de 10
Qual média geral esses dados produzem quando cada nota tem o mesmo peso?
records = {"p": {"scores": [10, 20]},
"q": {"scores": [90]}, "r": {"scores": []}}
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 8 de 10
O que este código imprime?
records = {"v1": {"team": "north", "scores": [2, 6]},
"v2": {"team": "south", "scores": []},
"v3": {"team": "north", "scores": [4]}}
totals = {}
for info in records.values():
team = info["team"]
for score in info["scores"]:
totals[team] = totals.get(team, 0) + score
print(totals.get("south", 0), totals["north"])
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 9 de 10
O que este código imprime?
required = {"a", "b", "c"}
current = {"a", "d"}
missing = required - current
current |= {"b"}
print(sorted(missing), sorted(required - current))
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 10 de 10
O que este código imprime?
left = {"x": 2, "y": 4}
right = {"y": 4, "x": 2}
print(left == right, list(left) == list(right))
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Travou em uma questão sua? Ajuda com Tarefas
Termos-Chave
A
Acumulador
Agrupamento
"map" e "memo" na mesma lista "m".Atualização
stock.update({"soap": 6}) realiza uma atualização e retorna None, não o dicionário atualizado.C
Campo opcional
get pode fornecer uma alternativa sem lançar KeyError."no email" quando um registro de estudante não o contém.Chave
"glue" recupera a quantidade 3 de um dicionário que armazena quantidades por nome de produto.Chave de comparação
key=, usado para comparar itens enquanto os itens originais são mantidos como resultados.sorted(wait, key=wait.get), cada tempo de espera armazenado é a chave de comparação para o nome de sua estação.Compreensão de dicionário
{word: len(word) for word in words} armazena um comprimento sob cada palavra.Conjunto
Conjuntos disjuntos
a.isdisjoint(b) retorna True.Consulta encadeada
devices["d7"]["ports"][0] acessa um registro, sua lista de portas e depois a primeira porta.Consulta por chave
prices["juice"] recupera o preço armazenado, desde que o dicionário tenha uma chave "juice".Contagem de valores distintos
len(set(items)) quando os itens de entrada são hasháveis.[7, 7, 2, 7] é dois, enquanto seu número total de ocorrências é quatro.Cópia profunda
Cópia superficial
Counter
"level" registra duas ocorrências de "l", duas de "e" e uma de "v".D
defaultdict
list inicia uma lista vazia separada sempre que uma nova chave de grupo é lida pela primeira vez.Desempacotamento de tupla
for name, score in scores.items(): disponibiliza ambas as partes no corpo do laço.Dicionário
{"tape": 8, "glue": 3}.Dicionário aninhado
students["ana"]["major"] leia um campo do registro de Ana.Diferença
a - b contém membros do conjunto à esquerda que estão ausentes do conjunto à direita, então a ordem dos operandos importa.required - skills encontra requisitos que faltam à pessoa candidata, não suas habilidades adicionais.Diferença simétrica
discard
blocked.discard(address) permite que um endereço já desbloqueado esteja ausente sem causar erro.E
Elemento
3 aparece uma vez em set([3, 3, 5]), então o conjunto resultante tem apenas dois membros.F
Filtro
if final de uma compreensão decide quais entradas produzem pares.if quantity > 0 deixa de fora produtos com estoque zero ao criar um novo dicionário.frozenset
Função de criação de valor padrão
defaultdict chama sem argumentos para criar um valor em uma consulta a chave ausente.list cria uma nova lista vazia para cada nova chave em defaultdict(list).H
Hashável
(4, 7) é hashável e pode identificar uma posição em uma grade, enquanto a lista [4, 7] não pode.I
Igualdade de coleções
{"a": 1, "b": 2} ser igual aos mesmos pares inseridos na ordem oposta.Inicialização
counts = {} dentro do laço apagaria as contagens coletadas em passagens anteriores.Interseção
Interseção de visões de chaves
& a visões de chaves de dicionário, retornando as chaves presentes em ambos os dicionários sem comparar seus valores.Inversão de dicionário
items
for city, temp in temps.items(): fornece cada cidade junto com sua temperatura.Iteração
{"west": 4, "east": 9} percorre "west" e depois "east", não as quantidades armazenadas.K
KeyError
stock["soap"] lança KeyError se não existir uma entrada para sabonete no dicionário de estoque.L
Laço aninhado
Lista
M
Mesclagem
a | b, chaves comuns recebem seus valores de b e ambas as entradas permanecem inalteradas.defaults | overrides permite que uma sobrescrita substitua um valor padrão para a mesma configuração.Mutação
stock["soap"] = 6 é uma mutação visível por qualquer outro nome para esse dicionário.N
Normalização de texto
"Map" e "map" compartilharem uma chave de contagem de palavras ao converter ambas para minúsculas.O
Ordem de inserção
"west" permanece antes de "east" se tiver sido adicionada primeiro, mesmo que seu valor mude.P
Par chave-valor
"room": 12 associa o nome de campo "room" ao número 12.pop
inventory.pop("pads") usa pop para recuperar a quantidade anterior enquanto remove esse produto.popitem
"a" e depois "b", popitem() retorna o par de "b", mesmo que seu valor seja menor.R
Registro
Relatório formatado
f"{name}: {average:.1f}" para exibir um ID e sua média arredondada.Remoção de duplicatas
list(dict.fromkeys(items)) mantém itens hasháveis na ordem de suas primeiras ocorrências.S
setdefault
setdefault cria uma lista para uma nova categoria e preserva a lista de uma categoria existente.Subconjunto
<= permite que os dois conjuntos sejam iguais.required <= skills só é bem-sucedido quando a pessoa candidata tem todas as habilidades exigidas.Subconjunto próprio
{2} < {2, 4} é verdadeiro, enquanto {2} < {2} é falso porque os conjuntos são iguais.Superconjunto
a >= b testa se a contém todos os membros de b, permitindo igualdade.skills >= required verifica se a pessoa candidata tem todas as habilidades exigidas.T
Tabela de frequências
[2, 5, 2] armazena uma contagem de dois sob 2 e uma sob 5.Teste de pertencimento
in ou not in para perguntar se uma coleção contém um item; em um dicionário, ele verifica chaves."soap" in stock continua verdadeiro quando a quantidade armazenada de sabonete é zero.Total por categoria
Tupla
("Dune", 1965) mantém um título e seu ano de publicação juntos como um par.U
União
morning | evening lista todas as pessoas que participam de uma das sessões, incluindo as que participam de ambas.V
Valor
"scores" pode ser uma lista, permitindo que um registro contenha todas as notas de um estudante.Valor mutável compartilhado
dict.fromkeys(keys, []) coloca uma lista sob cada chave de grupo.Valor padrão
get de um dicionário.stock.get("soap", 0), o valor padrão é zero; a chamada não cria uma entrada para sabonete.Verificação de lista vazia
if scores: impede que um registro sem notas cause uma divisão por zero.Visão de dicionário
keys(), values() ou items() que reflete alterações no dicionário.stock.keys() mostra um novo produto depois que ele é adicionado.Z
zip
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.