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
setdefaultpara 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
- Percorremos a lista
numeroscom um loopfor. - Para cada número, verificamos se é par (
n % 2 == 0) e definimos achavecomo'pares'ou'ímpares'. grupos.setdefault(chave, [])retorna a lista associada à chave; se a chave não existir, cria uma lista vazia e a associa.- Em seguida,
.append(n)adiciona o número à lista retornada. - No final,
gruposcontém as duas listas preenchidas. - O
printmostra 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 desetdefault: se a chave não existir, o valor padrão éNonee.appendfalha. - 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]}