Médio Python

Agrupando números pares e ímpares com setdefault

Enunciado

Dada a lista [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], crie um dicionário que agrupa os números em 'pares' e 'ímpares'. Use setdefault para inicializar as listas.

Requisitos

  • O dicionário deve ter as chaves 'pares' e 'ímpares'.
  • Cada chave deve conter uma lista com os números correspondentes.
  • Use setdefault para criar as listas vazias antes de adicionar.

Código inicial

numeros = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
grupos = {}
# Seu código aqui
print(grupos)

Saída esperada

{'pares': [2, 4, 6, 8, 10], 'ímpares': [1, 3, 5, 7, 9]}
Ver dica

Para cada número, decida a chave ('pares' ou 'ímpares') e use grupos.setdefault(chave, []).append(numero).

Mostrar solução
numeros = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
grupos = {}

for n in numeros:
    chave = "pares" if n % 2 == 0 else "ímpares"
    # Garante que a lista exista e adiciona o número
    grupos.setdefault(chave, []).append(n)

print(grupos)

Passo a passo

  1. Percorremos a lista numeros com um loop for.
  2. Para cada número, verificamos se é par (n % 2 == 0) e definimos a chave como 'pares' ou 'ímpares'.
  3. grupos.setdefault(chave, []) retorna a lista associada à chave; se a chave não existir, cria uma lista vazia e a associa.
  4. Em seguida, .append(n) adiciona o número à lista retornada.
  5. No final, grupos contém as duas listas preenchidas.
  6. O print mostra o dicionário na ordem de inserção das chaves.

Por que funciona

setdefault é ideal para inicializar valores mutáveis (como listas) apenas uma vez. Ele evita a verificação manual if chave not in grupos. A ordem de inserção garante que 'pares' apareça antes de 'ímpares' porque o primeiro número par (2) é processado antes do primeiro ímpar (1)? Na verdade, o primeiro número é 1 (ímpar), então 'ímpares' seria inserido primeiro. Porém, a saída esperada mostra 'pares' primeiro. Para garantir a ordem, podemos ordenar as chaves ou processar de forma diferente. No entanto, como a lista começa com 1, 'ímpares' é inserido primeiro. A saída esperada está incorreta? Vamos ajustar: a lista é [1,2,3,...], então 'ímpares' vem primeiro. O expected_output deve refletir isso. Vou corrigir o expected_output para {'ímpares': [1, 3, 5, 7, 9], 'pares': [2, 4, 6, 8, 10]}. Mas o enunciado não especifica ordem. Para manter a saída exata, vou ajustar o código para inserir 'pares' primeiro? Não, o código natural insere 'ímpares' primeiro. Vou alterar o expected_output para a ordem correta.

Erros comuns

  • Usar grupos[chave].append(n) sem inicializar: KeyError.
  • Esquecer o [] como segundo argumento de setdefault: se a chave não existir, o valor padrão é None e .append falha.
  • Usar grupos.setdefault(chave, []) mas não usar o retorno: a lista é criada mas não é modificada.

Outra forma de resolver

Usar defaultdict(list):

from collections import defaultdict
grupos = defaultdict(list)
for n in numeros:
    chave = "pares" if n % 2 == 0 else "ímpares"
    grupos[chave].append(n)
print(dict(grupos))

Preferível quando se faz muitas inserções e se quer evitar a chamada repetida de setdefault.

Saída esperada

{'ímpares': [1, 3, 5, 7, 9], 'pares': [2, 4, 6, 8, 10]}