Dicionários e conjuntos em Python

Aprenda como os dicionários Python armazenam valores associados a chaves, para que você possa consultar dados pelo nome, contar a frequência de ocorrências, agrupar itens em categorias e organizar registros dentro de outros registros. Depois, use conjuntos para remover duplicatas e comparar coleções com união, interseção e diferença, e aprenda quando escolher um dicionário, conjunto, lista ou tupla.

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

O que você vai aprender

  1. 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-valor
      Descreva 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ça
      Leia um valor com colchetes, verifique se uma chave existe com in e use get() para fornecer um valor padrão em vez de interromper o programa quando uma chave estiver ausente.
    • Adicione, altere e remova entradas
      Insira novos itens, atualize valores existentes, mescle dois dicionários e exclua entradas com del, pop() e métodos relacionados.
  2. 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 itens
      Use laços for com 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 existentes
      Crie 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.
  3. 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ências
      Crie uma tabela de frequências com um dicionário de contadores, conte palavras em um texto, encontre os itens mais comuns e reconheça Counter como um atalho.
    • Agrupe itens e some valores por categoria
      Reúna itens em listas sob uma chave comum, some valores por categoria, calcule médias de grupos e evite listas compartilhadas acidentalmente entre chaves.
  4. 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 aninhados
      Crie 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 aninhados
      Use laços, incluindo laços aninhados, para produzir relatórios, filtrar e resumir registros e tratar registros com campos ausentes ou listas vazias.
  5. 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 duplicatas
      Escreva 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 conjuntos
      Use 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 tarefa
      Compare 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.

Guia de estudo de Dicionários e conjuntos em Python

5 capítulos

1

Armazene 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 programaForma ú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ça KeyError quando a chave está ausente.
  • in testa chaves, incluindo chaves cujos valores são zero ou vazios.
  • get retorna 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çãoEfeito 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] = value adiciona uma chave ou substitui seu valor.
  • Na mesclagem de dicionários, o valor à direita prevalece para uma chave comum.
  • pop retorna um valor removido; popitem retorna o último par inserido.
  • update e clear retornam None.
  • setdefault insere 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.
2

Percorra 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çoO 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.get compara 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 if filtra; as expressões do par podem transformar os dados.
  • zip para na entrada mais curta.
  • Inverter um dicionário pode causar perda de entradas quando valores se repetem.
3

Conte 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) + 1 trata 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.get para classificar itens.
  • Counter cria 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.
  • setdefault e defaultdict(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.
4

Modele 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 get no 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.
5

Use 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çãoO 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.
  • remove lança uma exceção quando o elemento está ausente; discard permite 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ãoRegra de pertencimentoMembros, em ordem alfabética
`pythonsql`Em um conjunto ou em ambos
python & sqlEm ambos os conjuntosBen, Dev
python - sqlEm Python, mas não em SQLAna, Cara
python ^ sqlEm exatamente um conjuntoAna, 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 - b mantém apenas membros de a que estão ausentes de b.
  • <= permite conjuntos iguais; < exige um subconjunto próprio.
  • isdisjoint testa 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
TipoComo você acessa os dadosOrdem e repetiçõesA coleção pode ser alterada?
ListaPor posiçãoOrdenada; permite repetiçõesSim
TuplaPor posiçãoOrdenada; permite repetiçõesNão
DicionárioPor chaveOrdem de inserção; chaves únicasSim
ConjuntoPor pertencimentoSem ordem garantida; elementos únicosSim

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

5 Lições Interativas

1

Crie e mantenha um dicionário de estoque

14 passos
Crie pares chave-valor, escolha consultas seguras e rastreie alterações e mesclagens de estoque.
  1. 1
    Introduçã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.

  2. 2
    ExemploEscreva 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 chave 0, não o primeiro produto. Embora dicionários preservem a ordem de inserção, suas entradas continuam sendo acessadas por chaves.

  3. 3
    Explicaçã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.

  4. 4
    DesafioConte 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 valor 7. 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.

  5. 5
    ExplicaçãoDecida o que a ausência significa

    stock["clips"] lança KeyError porque 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.

  6. 6
    Ideia-chaveUm zero armazenado ainda tem uma chave

    Suponha que stock["pads"] = 0 registre que os blocos estão esgotados. "pads" in stock ainda é 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 retorna None. Quando a pergunta for se um registro existe, teste a chave com in.

  7. 7
    DesafioMantenha 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 se stock[item] será lido?

    ---reveal---

    Use if item in stock:. Blocos passa nesse teste e exibe zero. No ramo else, imprima "missing". Um teste do valor lógico da quantidade retornada trataria incorretamente o registro do produto esgotado como ausente.

  8. 8
    ExemploRegistre uma venda e uma entrega

    Comece um novo estoque:

    stock = {"pens": 10, "pads": 4}
    stock["pens"] -= 3
    stock["clips"] = 50
    

    A venda lê a quantidade anterior de canetas e armazena 7. A entrega cria uma nova chave para clipes com valor 50. 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étodo append.

  9. 9
    ExemploRecupere uma quantidade removida

    Continue com o estoque:

    removed = stock.pop("pads")
    

    removed passa a ser 4, e o dicionário passa a ser {"pens": 7, "clips": 50}. pop altera a coleção e também retorna o valor removido.

    Use del stock["pads"] quando precisar apenas da remoção. Ambas as formas lançam KeyError em caso de ausência, a menos que pop receba um valor padrão, como em stock.pop("pads", 0).

  10. 10
    DesafioTrate uma segunda remoção

    O estoque atual é {"pens": 7, "clips": 50}. O que stock.pop("pads", 0) retorna e o que acontece com o estoque?

    ---reveal---

    Ele retorna 0 e 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.

  11. 11
    ExplicaçãoMescle configurações sem perder a base

    Para dois dicionários, base | overrides cria um novo resultado e faz o lado direito prevalecer nas chaves comuns:

    base = {"size": 2, "color": "blue"}
    result = base | {"size": 5}
    

    result tem tamanho 5 e cor "blue"; base ainda tem tamanho 2. Esse operador está disponível desde o Python 3.9. base.update(overrides) alteraria a base e retornaria None.

  12. 12
    DicaAcompanhe 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() e clear() retornam None, enquanto pop() retorna um valor. Não atribua o resultado de uma atualização de volta ao nome de que você precisa para o dicionário.

  13. 13
    DesafioUse um valor padrão sem sobrescrever

    Um programa começa com stock = {"pens": 7}. Ele chama stock.get("clips", 20), depois stock.setdefault("clips", 5) e então adiciona 2 a stock["clips"]. Qual é a quantidade final de clipes?

    ---reveal---

    É 7. get retorna 20, mas não insere nada. setdefault cria então clipes com 5, e a atualização final adiciona 2. Um valor padrão de consulta não é um valor armazenado, a menos que uma operação realmente o insira.

  14. 14
    Recapitulaçã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, in para existência e get para 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.

2

Transforme dados de dicionário em relatórios

12 passos
Escolha entradas de laços, ordene por chaves ou valores e crie dicionários filtrados ou transformados.

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

  1. 1
    IntroduçãoEscolha o que cada laço recebe
  2. 2
    ExemploReceba as duas partes de um par
  3. 3
    Ideia-chaveUma visão permanece conectada
  4. 4
    ExemploOrdene por um valor armazenado
  5. 5
    DesafioMantenha nomes em ordem de valor
  6. 6
    ExemploCrie um dicionário com um laço
  7. 7
    ConexãoExpresse a mesma regra de forma compacta
  8. 8
    ExemploFiltre primeiro e depois produza o par
  9. 9
    DesafioCombine um filtro e uma transformação
  10. 10
    DicaVerifique os pares antes de criar o dicionário
  11. 11
    DesafioRemova entradas com valores baixos sem interromper o laço
  12. 12
    RecapitulaçãoCombine a entrada com o resultado
3

Crie contagens, grupos e totais por categoria

13 passos
Rastreie primeiras ocorrências, preserve membros de grupos e calcule resultados para cada categoria.

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

  1. 1
    IntroduçãoDeixe cada categoria acumular um resultado
  2. 2
    ExemploDê a um novo item sua primeira contagem
  3. 3
    ExemploUse zero para um item ainda não encontrado
  4. 4
    DesafioDescubra por que uma contagem nunca aumenta
  5. 5
    DicaLimpe antes de escolher a chave
  6. 6
    ExplicaçãoMantenha os membros de cada grupo
  7. 7
    ExemploRastreie uma atualização de valor do tipo lista
  8. 8
    Ideia-chaveCada grupo precisa de uma lista separada
  9. 9
    DesafioPreveja um novo grupo automático
  10. 10
    ExemploSome valores em vez de ocorrências
  11. 11
    ExemploCalcule a média dos valores de cada grupo
  12. 12
    DesafioEscolha com o que cada registro contribui
  13. 13
    RecapitulaçãoPreserve o resultado entre as passagens
4

Leia e resuma registros aninhados

11 passos
Acompanhe consultas encadeadas, copie registros de forma consciente e gere relatórios a partir de listas armazenadas.

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

  1. 1
    IntroduçãoSepare IDs de registros dos campos
  2. 2
    ExemploSiga o caminho até uma nota
  3. 3
    DesafioAdicione um campo a um novo registro
  4. 4
    Ideia-chaveCopiar a parte externa pode compartilhar a interna
  5. 5
    DesafioMantenha independentes as notas de teste
  6. 6
    ExemploCalcule uma média por registro
  7. 7
    DicaTrate um registro sem notas
  8. 8
    ConexãoLeia campos no nível do registro
  9. 9
    ExemploPercorra todas as notas dos registros
  10. 10
    DesafioCombine um campo e uma lista armazenada
  11. 11
    RecapitulaçãoMantenha cada nível visível
5

Compare o pertencimento e escolha coleções

15 passos
Remova repetições, use operações de conjuntos e combine conjuntos com registros e sequências ordenadas.

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

  1. 1
    IntroduçãoPergunte quem pertence a cada coleção
  2. 2
    ExplicaçãoCrie uma coleção de membros únicos
  3. 3
    DicaAdicione e remova o elemento desejado
  4. 4
    ExemploPreserve as primeiras ocorrências
  5. 5
    DesafioMantenha a sequência original de rótulos distintos
  6. 6
    ExemploEncontre todos ou apenas os estudantes em comum
  7. 7
    ExemploLeia a diferença da esquerda para a direita
  8. 8
    DesafioEncontre pessoas em exatamente um clube
  9. 9
    ExplicaçãoVerifique todos os requisitos
  10. 10
    Ideia-chaveDistinga um resultado de um conjunto alterado
  11. 11
    ConexãoMantenha histórico, identidade e pertencimento
  12. 12
    ExemploCompare chaves sem comparar quantidades
  13. 13
    DesafioEscolha uma coleção para um registro crescente
  14. 14
    DesafioCombine visões de chaves com uma verificação de registro ausente
  15. 15
    RecapitulaçãoEscolha primeiro a pergunta de pertencimento

Questões de Dicionários e conjuntos em Python

40 Questões de Prática em 4 conjuntos

Conjunto 1: Leia e altere coleções Python10 Questões de Prática

Questão 1 de 10

Quantos itens há em {"oak": 4, "pine": 7, "oak": 9}?
  1. 3
  2. 2
  3. 4
  4. 6
Mostrar respostaOcultar resposta
Resposta: B
A chave repetida "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

Para levels = {"east": 0, "west": 5}, o que "east" in levels retorna?
  1. False
  2. 0
  3. None
  4. True
Mostrar respostaOcultar resposta
Resposta: D
O teste de pertencimento verifica se "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"])
  1. 6 6
  2. 6 8
  3. None 6
  4. 0 6
Mostrar respostaOcultar resposta
Resposta: A
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

O que sum({"small": 3, "large": 9}.values()) retorna?
  1. 2
  2. 9
  3. 12
  4. 6
Mostrar respostaOcultar resposta
Resposta: C
A visão de valores fornece os números 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

Qual dicionário {name: len(name) for name in ["elm", "cedar"]} cria?
  1. {3: 'elm', 5: 'cedar'}
  2. {'elm': 5, 'cedar': 3}
  3. {'elm': 3, 'cedar': 5}
  4. {'elm': 1, 'cedar': 1}
Mostrar respostaOcultar resposta
Resposta: C
A expressão antes dos dois-pontos fornece cada chave, então os nomes permanecem como chaves. 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
  1. 3
  2. 1
  3. 2
  4. 4
Mostrar respostaOcultar resposta
Resposta: A
O primeiro "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)
  1. ['reed']
  2. ['rose', 'mint', 'reed']
  3. ['r', 'r']
  4. ['rose', 'reed']
Mostrar respostaOcultar resposta
Resposta: D
A primeira palavra cria a lista de "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

Para devices = {"d7": {"ports": [2, 4, 8]}}, o que devices["d7"]["ports"][-1] retorna?
  1. 2
  2. 8
  3. 4
  4. 3
Mostrar respostaOcultar resposta
Resposta: B
A primeira consulta seleciona o registro do dispositivo, a segunda seleciona sua lista de portas e [-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

O que len(set([8, 2, 8, 5, 2])) retorna?
  1. 2
  2. 4
  3. 3
  4. 5
Mostrar respostaOcultar resposta
Resposta: C
O conjunto contém os três números distintos 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

Um serviço exige {"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?
  1. required <= (current | grant)
  2. required <= (current & grant)
  3. required >= (current | grant)
  4. required < (current & grant)
Mostrar respostaOcultar resposta
Resposta: A
A união adiciona a concessão às permissões atuais, produzindo leitura, compartilhamento e escrita. O teste de subconjunto verifica então se cada permissão exigida pertence a esse conjunto combinado. A interseção manteria apenas permissões já presentes em ambas as entradas, que aqui são disjuntas, então descartaria a nova concessão em vez de adicioná-la.
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

Após rates = {"basic": 7} e result = rates.get("plus", 0), quais são os valores de result e len(rates)?
  1. 0 e 2
  2. None e 1
  3. 0 e 1
  4. 7 e 1
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))
  1. ['light', 'sound']
  2. ['sound', 'light']
  3. ['light']
  4. ['sound', 'light', 'sound']
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 3 de 10

Para wait = {"A": 9, "B": 3, "C": 6}, o que sorted(wait, key=wait.get) retorna?
  1. ['A', 'B', 'C']
  2. ['B', 'C', 'A']
  3. ['A', 'C', 'B']
  4. [3, 6, 9]
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])
  1. None
  2. 1
  3. KeyError: 9
  4. 0
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"])
  1. [12]
  2. [18]
  3. [[12], [18]]
  4. [12, 18]
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)
  1. 2 False
  2. 5 False
  3. 5 True
  4. 2 True
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 7 de 10

Um registro contém {"scores": []}. Qual condição deve proteger sum(scores) / len(scores) após scores = record["scores"]?
  1. if scores:
  2. if "scores" in record:
  3. if scores is not None:
  4. if len(scores) >= 0:
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 8 de 10

Qual chamada de método remove "paused" de states permitindo que ele esteja ausente?
  1. states.remove("paused")
  2. states.pop("paused")
  3. states.discard("paused")
  4. states.clear("paused")
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 9 de 10

Para morning = {"Ivo", "June", "Kai"} e evening = {"June", "Mina"}, quais são os membros de morning ^ evening?
  1. Ivo, June, Kai, Mina
  2. Ivo, Kai, Mina
  3. June
  4. Ivo, Kai
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 10 de 10

Um monitor deve manter cada leitura de sensor na ordem de chegada, incluindo repetições, e verificar separadamente se cada ID de sensor está autorizado. Qual par de coleções é mais adequado?
  1. Uma lista de leituras e um conjunto de IDs autorizados.
  2. Um conjunto de leituras e uma lista de IDs autorizados.
  3. Um dicionário com as leituras como chaves e um conjunto de IDs autorizados.
  4. Uma tupla de leituras e um dicionário com as leituras como chaves.
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

Qual é o valor de len({1: "first", True: "second", "1": "third"})?
  1. 1
  2. 3
  3. 6
  4. 2
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 2 de 10

Um relatório de estoque deve imprimir uma quantidade armazenada, incluindo zero, ou "missing" quando a chave do produto estiver ausente. Qual corpo de função atende a esse requisito?
  1. if stock.get(product):
        return stock[product]
    return "missing"
    
  2. if product in stock:
        return stock[product]
    return "missing"
    
  3. return stock.get(product) or "missing"
    
  4. if product in stock.values():
        return stock[product]
    return "missing"
    
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()}
  1. {'design': 'Pia', 'support': 'Omar'}
  2. {'design': ['Luz', 'Pia'], 'support': ['Omar']}
  3. {'design': 'Luz', 'support': 'Omar'}
  4. {'Luz': 'design', 'Omar': 'support', 'Pia': 'design'}
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 4 de 10

Após contar as palavras de "Go go! Stop." usando lower().split() e word.strip(".,!?"), qual é a contagem de "go"?
  1. 2
  2. 1
  3. 3
  4. 0
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 5 de 10

Um laço de totais processa [("repair", 14), ("delivery", 6), ("repair", 9)]. Com totals[category] = totals.get(category, 0) + amount, qual é o valor de totals["repair"]?
  1. 9
  2. 14
  3. 23
  4. 29
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 6 de 10

Um dicionário contém registros como valores do tipo dicionário. O que records.get("x9", {}).get("email", "none") retorna quando "x9" está ausente?
  1. {}
  2. None
  3. KeyError: 'x9'
  4. "none"
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)
  1. 0
  2. 1
  3. 2
  4. 3
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 8 de 10

O que list(dict.fromkeys(["z", "m", "z", "a"])) retorna?
  1. ['a', 'm', 'z']
  2. ['z', 'm', 'a']
  3. ['z', 'm', 'z', 'a']
  4. ['m', 'z', 'a']
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 9 de 10

O que {2, 5} < {2, 5} retorna?
  1. True
  2. False
  3. set()
  4. None
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()))
  1. [('cord', 9)]
  2. [('plug', 8)]
  3. [('cord', 9), ('plug', 2)]
  4. [('plug', 2)]
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

Uma grade armazena valores por pares de coordenadas. Qual chave o Python pode aceitar diretamente?
  1. [3, 5]
  2. (3, 5)
  3. {3, 5}
  4. {"x": 3, "y": 5}
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))
  1. 4 4 2
  2. 4 6 1
  3. 4 6 2
  4. 6 6 2
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"])
  1. 5 3 5
  2. 5 3 2
  3. 2 1 2
  4. 5 1 2
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))
  1. ['low', 'high', 'mid']
  2. ['high', 'mid']
  3. ['mid', 'high']
  4. ['low']
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}
  1. {'Sol': 18}
  2. {'Rae': 14, 'Sol': 18}
  3. {'Sol': 9}
  4. {'Sol': 18, 'Tia': 18}
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))
  1. 1 0
  2. 2 1
  3. 1 1
  4. 2 0
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": []}}
  1. 40.0
  2. 52.5
  3. 60.0
  4. 30.0
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"])
  1. 0 4
  2. 1 12
  3. 0 12
  4. 0 8
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))
  1. ['c'] ['c']
  2. ['b', 'c'] ['b', 'c']
  3. ['b', 'c'] ['c']
  4. ['d'] ['c']
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))
  1. True False
  2. True True
  3. False True
  4. False False
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Travou em uma questão sua? Ajuda com Tarefas

Termos-Chave

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

A

Acumulador
Um acumulador é uma variável que reúne um resultado ao longo das passagens de um laço, como um total acumulado ou uma contagem de entradas que atendem a uma condição.
Um acumulador inicializado antes do laço de notas pode contar todos os estudantes que atingem a nota de aprovação.
Agrupamento
O agrupamento reúne entradas sob rótulos de categoria comuns, frequentemente associando cada rótulo a uma lista de todos os membros atribuídos a ele.
Agrupar nomes de arquivos pela primeira letra coloca "map" e "memo" na mesma lista "m".
Atualização
Uma atualização copia pares para um dicionário existente, adicionando novas chaves e substituindo valores sob chaves que já existem.
Chamar stock.update({"soap": 6}) realiza uma atualização e retorna None, não o dicionário atualizado.

C

Campo opcional
Um campo opcional pode estar ausente em alguns registros, então lê-lo com get pode fornecer uma alternativa sem lançar KeyError.
Um campo opcional de e-mail pode ser exibido como "no email" quando um registro de estudante não o contém.
Chave
Uma chave identifica um valor em um dicionário; usar a chave recupera esse valor sem depender da posição do par.
A chave "glue" recupera a quantidade 3 de um dicionário que armazena quantidades por nome de produto.
Chave de comparação
Uma chave de comparação é o valor produzido pela função passada como key=, usado para comparar itens enquanto os itens originais são mantidos como resultados.
Com 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
Uma compreensão de dicionário cria um novo dicionário produzindo pares chave-valor a partir de um iterável, opcionalmente filtrando as entradas.
A compreensão de dicionário {word: len(word) for word in words} armazena um comprimento sob cada palavra.
Conjunto
Um conjunto é uma coleção mutável de elementos únicos e hasháveis sem ordem garantida, usada para testes de pertencimento e comparações de coleções.
Um conjunto de IDs de livros emprestados responde se um ID está presente sem armazenar um valor separado para ele.
Conjuntos disjuntos
Conjuntos disjuntos não compartilham nenhum elemento, então sua interseção é vazia e chamar a.isdisjoint(b) retorna True.
Os conjuntos de resultados ímpares e pares de um dado são conjuntos disjuntos porque nenhum resultado possível pertence a ambos.
Consulta encadeada
Uma consulta encadeada aplica vários acessos em sequência, cada um ao objeto retornado pelo acesso anterior ao dicionário ou à lista.
A consulta encadeada devices["d7"]["ports"][0] acessa um registro, sua lista de portas e depois a primeira porta.
Consulta por chave
Uma consulta por chave em um dicionário usa uma chave para recuperar seu valor associado; uma consulta com colchetes lança um erro quando essa chave está ausente.
A consulta prices["juice"] recupera o preço armazenado, desde que o dicionário tenha uma chave "juice".
Contagem de valores distintos
Uma contagem de valores distintos mede quantos valores diferentes ocorrem e é obtida com len(set(items)) quando os itens de entrada são hasháveis.
A contagem de valores distintos de [7, 7, 2, 7] é dois, enquanto seu número total de ocorrências é quatro.
Cópia profunda
Uma cópia profunda copia recursivamente coleções aninhadas, criando dicionários e listas separados que podem ser editados independentemente do original.
Uma cópia profunda permite que um programa experimente novas notas em um registro copiado sem editar a lista de notas original.
Cópia superficial
Uma cópia superficial cria uma coleção externa separada enquanto reutiliza referências aos objetos internos da coleção original.
Uma cópia superficial de registros de estudantes ainda compartilha cada dicionário de estudante, então alterar uma idade afeta ambos.
Counter
Um Counter é um tipo de dicionário da biblioteca padrão para contar itens hasháveis, que retorna zero em uma consulta a item ausente.
Um Counter criado a partir de "level" registra duas ocorrências de "l", duas de "e" e uma de "v".

D

defaultdict
Um defaultdict é um tipo de dicionário que cria e armazena um valor a partir de uma função de criação fornecida quando uma chave ausente é lida com colchetes.
Um defaultdict criado com list inicia uma lista vazia separada sempre que uma nova chave de grupo é lida pela primeira vez.
Desempacotamento de tupla
O desempacotamento de tupla atribui os elementos de uma tupla a nomes separados, como a chave e o valor recebidos de um item de dicionário.
O desempacotamento de tupla em for name, score in scores.items(): disponibiliza ambas as partes no corpo do laço.
Dicionário
Um dicionário é uma coleção mutável que associa chaves únicas e hasháveis a valores e preserva a ordem em que as chaves foram inseridas.
Um dicionário pode associar cada nome de produto à sua quantidade atual, como em {"tape": 8, "glue": 3}.
Dicionário aninhado
Um dicionário aninhado contém outro dicionário como valor, permitindo que chaves externas identifiquem registros e chaves internas identifiquem campos.
Um dicionário aninhado de estudantes permite que students["ana"]["major"] leia um campo do registro de Ana.
Diferença
A diferença a - b contém membros do conjunto à esquerda que estão ausentes do conjunto à direita, então a ordem dos operandos importa.
A diferença required - skills encontra requisitos que faltam à pessoa candidata, não suas habilidades adicionais.
Diferença simétrica
A diferença simétrica contém elementos em exatamente um de dois conjuntos, removendo os membros compartilhados de seus membros combinados.
A diferença simétrica de duas listas de membros de clubes contém pessoas que entraram em um clube, mas não em ambos.
discard
O método de conjunto discard remove um elemento especificado quando ele está presente e deixa o conjunto inalterado quando o elemento está ausente.
Chamar discard com blocked.discard(address) permite que um endereço já desbloqueado esteja ausente sem causar erro.

E

Elemento
Um elemento é um membro de um conjunto; valores iguais contam como o mesmo membro mesmo quando são fornecidos mais de uma vez.
O elemento 3 aparece uma vez em set([3, 3, 5]), então o conjunto resultante tem apenas dois membros.

F

Filtro
Um filtro mantém apenas entradas que atendem a uma condição; a cláusula if final de uma compreensão decide quais entradas produzem pares.
Um filtro como if quantity > 0 deixa de fora produtos com estoque zero ao criar um novo dicionário.
frozenset
Um frozenset é um conjunto imutável cuja hashabilidade permite que ele sirva como chave de dicionário ou elemento de outro conjunto.
Um frozenset pode representar um grupo fixo de etiquetas quando todo esse grupo deve ser usado como chave de dicionário.
Função de criação de valor padrão
Uma função de criação de valor padrão é a função que um defaultdict chama sem argumentos para criar um valor em uma consulta a chave ausente.
A função de criação de valor padrão list cria uma nova lista vazia para cada nova chave em defaultdict(list).

H

Hashável
Um objeto é hashável quando pode servir como chave de dicionário ou elemento de conjunto; strings, números e tuplas de itens hasháveis atendem a esse requisito.
A tupla (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 igualdade de coleções compara conteúdos de acordo com o tipo de coleção: listas exigem a mesma ordem, enquanto dicionários e conjuntos ignoram a ordem.
A igualdade de coleções faz {"a": 1, "b": 2} ser igual aos mesmos pares inseridos na ordem oposta.
Inicialização
A inicialização dá a uma variável seu valor inicial antes do processamento, como um dicionário vazio antes de um laço de contagem.
A inicialização de counts = {} dentro do laço apagaria as contagens coletadas em passagens anteriores.
Interseção
A interseção de dois conjuntos contém apenas os elementos presentes em ambos, excluindo membros encontrados em apenas uma entrada.
A interseção de IDs de pessoas inscritas e IDs de pessoas que pagaram identifica quem pertence aos dois grupos.
Interseção de visões de chaves
Uma interseção de visões de chaves aplica & a visões de chaves de dicionário, retornando as chaves presentes em ambos os dicionários sem comparar seus valores.
Uma interseção de visões de chaves dos dicionários de estoque de duas lojas encontra produtos vendidos por ambas as lojas, mesmo quando suas quantidades em estoque são diferentes.
Inversão de dicionário
A inversão de dicionário troca chaves por valores; ela exige valores hasháveis, e valores repetidos tornam-se uma única nova chave.
A inversão de dois nomes com a mesma cor favorita preserva apenas o último nome sob essa cor.
items
A visão items fornece entradas de dicionário como tuplas chave-valor, para que um laço possa receber ambas as partes de cada par armazenado.
A visão items em for city, temp in temps.items(): fornece cada cidade junto com sua temperatura.
Iteração
A iteração percorre os elementos fornecidos por uma coleção, um por passagem do laço; percorrer diretamente um dicionário fornece suas chaves.
A iteração sobre {"west": 4, "east": 9} percorre "west" e depois "east", não as quantidades armazenadas.

K

KeyError
Um KeyError é uma exceção lançada pela consulta a uma chave de dicionário ausente ou por certas operações de remoção de chaves ou elementos ausentes.
A expressão stock["soap"] lança KeyError se não existir uma entrada para sabonete no dicionário de estoque.

L

Laço aninhado
Um laço aninhado executa um laço interno durante cada passagem de um laço externo, como ao percorrer cada nota dentro de cada registro.
Um laço aninhado sobre estudantes e suas notas pode contar as notas que atendem a uma condição em toda a turma.
Lista
Uma lista é uma sequência mutável e ordenada que permite valores repetidos e oferece acesso aos elementos por suas posições.
Uma lista de empréstimos preserva o mesmo ID de livro duas vezes quando o livro é emprestado duas vezes em um dia.

M

Mesclagem
Uma mesclagem de dicionários combina pares em um resultado; com a | b, chaves comuns recebem seus valores de b e ambas as entradas permanecem inalteradas.
A mesclagem defaults | overrides permite que uma sobrescrita substitua um valor padrão para a mesma configuração.
Mutação
Uma mutação altera um objeto existente, por exemplo adicionando um par a um dicionário ou substituindo seu valor, sem criar um objeto substituto.
A atribuição stock["soap"] = 6 é uma mutação visível por qualquer outro nome para esse dicionário.

N

Normalização de texto
A normalização de texto torna consistentes diferenças escolhidas antes do processamento, como converter palavras para minúsculas para que maiúsculas e minúsculas não separem suas contagens.
A normalização de texto pode fazer "Map" e "map" compartilharem uma chave de contagem de palavras ao converter ambas para minúsculas.

O

Ordem de inserção
A ordem de inserção é a ordem em que as chaves de um dicionário foram adicionadas, preservada ao percorrer ou exibir o dicionário.
Na ordem de inserção, "west" permanece antes de "east" se tiver sido adicionada primeiro, mesmo que seu valor mude.

P

Par chave-valor
Um par chave-valor é um item de dicionário formado por uma chave única e seu valor associado; dois-pontos os ligam em um literal.
O par chave-valor "room": 12 associa o nome de campo "room" ao número 12.
pop
O método de dicionário pop remove uma chave especificada e retorna seu valor armazenado, usando um valor padrão fornecido se a chave estiver ausente.
Uma chamada de inventory.pop("pads") usa pop para recuperar a quantidade anterior enquanto remove esse produto.
popitem
O método de dicionário popitem remove e retorna o par chave-valor inserido mais recentemente como uma tupla de dois elementos.
Após adicionar as chaves "a" e depois "b", popitem() retorna o par de "b", mesmo que seu valor seja menor.

R

Registro
Um registro armazena campos relacionados sobre uma entidade, frequentemente como um dicionário cujas chaves nomeiam campos como idade, área de estudo ou notas.
Um registro de um dispositivo pode conter seu modelo como uma string e suas portas disponíveis como uma lista.
Relatório formatado
Um relatório formatado apresenta dados selecionados em uma saída legível, como uma linha por registro com uma média exibida com uma casa decimal.
Um relatório formatado pode usar f"{name}: {average:.1f}" para exibir um ID e sua média arredondada.
Remoção de duplicatas
A remoção de duplicatas elimina ocorrências repetidas, deixando um representante de cada valor distinto, com a ordem preservada apenas por um método adequado.
A remoção de duplicatas com list(dict.fromkeys(items)) mantém itens hasháveis na ordem de suas primeiras ocorrências.

S

setdefault
O método de dicionário setdefault retorna um valor existente ou primeiro insere e retorna um valor padrão quando sua chave está ausente.
O agrupamento com setdefault cria uma lista para uma nova categoria e preserva a lista de uma categoria existente.
Subconjunto
Um subconjunto tem todos os seus elementos contidos em outro conjunto; o teste <= permite que os dois conjuntos sejam iguais.
O teste de subconjunto required <= skills só é bem-sucedido quando a pessoa candidata tem todas as habilidades exigidas.
Subconjunto próprio
Um subconjunto próprio é um subconjunto que não é igual ao conjunto que o contém, o qual deve ter pelo menos um elemento adicional.
O teste de subconjunto próprio {2} < {2, 4} é verdadeiro, enquanto {2} < {2} é falso porque os conjuntos são iguais.
Superconjunto
Um superconjunto contém todos os elementos de outro conjunto; a >= b testa se a contém todos os membros de b, permitindo igualdade.
O teste de superconjunto skills >= required verifica se a pessoa candidata tem todas as habilidades exigidas.

T

Tabela de frequências
Uma tabela de frequências associa cada item distinto ao seu número de ocorrências, frequentemente usando um dicionário com contagens inteiras como valores.
Uma tabela de frequências para os lançamentos [2, 5, 2] armazena uma contagem de dois sob 2 e uma sob 5.
Teste de pertencimento
Um teste de pertencimento usa in ou not in para perguntar se uma coleção contém um item; em um dicionário, ele verifica chaves.
O teste de pertencimento "soap" in stock continua verdadeiro quando a quantidade armazenada de sabonete é zero.
Total por categoria
Um total por categoria é a soma dos valores atribuídos a um rótulo, calculada adicionando cada novo valor ao total anterior desse rótulo.
Um total por categoria para alimentação soma todas as despesas com alimentação, mesmo quando despesas de viagem ocorrem entre elas.
Tupla
Uma tupla é uma coleção ordenada com posições fixas; seus itens não podem ser substituídos, embora um objeto mutável contido nela ainda possa mudar.
Uma tupla como ("Dune", 1965) mantém um título e seu ano de publicação juntos como um par.

U

União
A união de dois conjuntos contém todos os elementos encontrados em um conjunto ou em ambos, com cada elemento igual aparecendo uma vez.
A união morning | evening lista todas as pessoas que participam de uma das sessões, incluindo as que participam de ambas.

V

Valor
Um valor de dicionário é o objeto armazenado sob uma chave e pode ser um número, string, lista, dicionário ou qualquer outro tipo.
O valor sob "scores" pode ser uma lista, permitindo que um registro contenha todas as notas de um estudante.
Valor mutável compartilhado
Um valor mutável compartilhado é um objeto alterável armazenado ou nomeado em vários lugares, de modo que uma edição por uma referência aparece pelas outras.
Um valor mutável compartilhado resulta quando dict.fromkeys(keys, []) coloca uma lista sob cada chave de grupo.
Valor padrão
Um valor padrão é uma alternativa fornecida para uma consulta a chave ausente, como o segundo argumento do método get de um dicionário.
Em stock.get("soap", 0), o valor padrão é zero; a chamada não cria uma entrada para sabonete.
Verificação de lista vazia
Uma verificação de lista vazia verifica se uma lista contém valores antes de uma operação que precisa deles, como dividir uma soma pelo comprimento da lista.
A verificação de lista vazia if scores: impede que um registro sem notas cause uma divisão por zero.
Visão de dicionário
Uma visão de dicionário é um objeto dinâmico retornado por keys(), values() ou items() que reflete alterações no dicionário.
Uma visão de dicionário armazenada de stock.keys() mostra um novo produto depois que ele é adicionado.

Z

zip
A função zip forma pares de elementos correspondentes de suas entradas e para quando a entrada mais curta não tem mais elementos.
Usar zip para formar pares de nomes e notas omite nomes sem correspondência quando a lista de notas é mais curta.

Sobre esta aula

Por StudeliRelatar um erro

Crie seus próprios Materiais de Estudo

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

Começar