1
resposta

(08. Python para Dados: Estruturas de dados) Desafio: hora da prática

# 1. Questão

lista_de_listas = [[4,6,5,9], [1,0,7,2], [3,4,1,8]]

for lista in lista_de_listas:
    print(sum(lista))
    
    
# 2. Questão

lista_de_tuplas = [('Pedro', 1.74, 81), ('Júlia', 1.65, 67), ('Otávio', 1.81, 83)]

terceiros_elementos = []

for tupla in lista_de_tuplas:
    terceiros_elementos.append(tupla[2])

print(terceiros_elementos)


# 3. Questão

lista = ['Pedro', 'Júlia', 'Otávio', 'Eduardo']

lista_de_tuplas = []

for indice, nome in enumerate(lista):
    lista_de_tuplas.append((indice, nome))

print(lista_de_tuplas)


# 4. Questão

aluguel = [('Apartamento', 1700), ('Apartamento', 1400), ('Casa', 2150), ('Apartamento', 1900), ('Casa', 1100)]

valores = [valor for tipo, valor in aluguel if tipo == 'Apartamento']

print(valores)


# 5. Questão

meses = ['Jan', 'Fev', 'Mar', 'Abr', 'Mai', 'Jun', 'Jul', 'Ago', 'Set', 'Out', 'Nov', 'Dez']

despesa = [860, 490, 1010, 780, 900, 630, 590, 770, 620, 560, 840, 360]

dicionario = {mes: valor for mes, valor in zip(meses, despesa)}

print(dicionario)


# 6. Questão

vendas = [('2023', 4093), ('2021', 4320), ('2021', 5959), ('2022', 8883), ('2023', 9859), ('2022', 5141), ('2022', 7688), ('2022', 9544), ('2023', 4794), ('2021', 7178), ('2022', 3030), ('2021', 7471), ('2022', 4226), ('2022', 8190), ('2021', 9680), ('2022', 5616)]

filtrados = [valor for ano, valor in vendas if ano == '2022' and valor > 6000]

print(filtrados)


# 7. Questão

glicemia = [129, 82, 60, 97, 101, 65, 62, 167, 87, 53, 58, 92, 66, 120, 109, 62, 86, 96, 103, 88, 155, 52, 89, 73]

resultado = [
    (
        'Hipoglicemia' if valor <= 70 else
        'Normal' if valor <= 99 else
        'Alterada' if valor <= 125 else
        'Diabetes',
        valor
    )
    for valor in glicemia
]

print(resultado)


# 8. Questão

id = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
quantidade = [15, 12, 1, 15, 2, 11, 2, 12, 2, 4]
preco = [93.0, 102.0, 18.0, 41.0, 122.0, 14.0, 71.0, 48.0, 14.0, 144.0]

tabela = [('id', 'quantidade', 'preco', 'total')] + [
    (i, q, p, q * p)
    for i, q, p in zip(id, quantidade, preco)
]

print(tabela)


# 9. Questão

estados = ['SP', 'ES', 'MG', 'MG', 'SP', 'MG', 'ES', 'ES', 'ES', 'SP', 'SP', 'MG', 'ES', 'SP', 'RJ', 'MG', 'RJ', 'SP', 'MG', 'SP', 'ES', 'SP', 'MG']

contagem = {estado: estados.count(estado) for estado in set(estados)}

print(contagem)


# 10. Questão

funcionarios = [('SP', 16), ('ES', 8), ('MG', 9), ('MG', 6), ('SP', 10), ('MG', 4), ('ES', 9), ('ES', 7), ('ES', 12), ('SP', 7), ('SP', 11), ('MG', 8), ('ES', 8), ('SP', 9), ('RJ', 13), ('MG', 5), ('RJ', 9), ('SP', 12), ('MG', 10), ('SP', 7), ('ES', 14), ('SP', 10), ('MG', 12)]

# Dicionário com listas de funcionários por estado
agrupados = {
    estado: [num for uf, num in funcionarios if uf == estado]
    for estado in set(uf for uf, _ in funcionarios)
}

# Dicionário com soma de funcionários por estado
soma_funcionarios = {
    estado: sum(valores)
    for estado, valores in agrupados.items()
}

print(agrupados)
print(soma_funcionarios)
1 resposta

Olá, Eduardo. Como vai?

Parabéns pelo excelente desempenho na resolução de todas as questões do desafio! O seu código demonstra que você assimilou com maestria os conceitos mais poderosos de manipulação de coleções em Python, como list comprehension, dict comprehension, o uso da função zip() e a manipulação inteligente de estruturas aninhadas.

Gostaria de destacar alguns pontos excepcionais na sua escrita de código:

  • Domínio de Comprehensions: Nas questões 4, 5, 6, 7 e 8, você utilizou compreensões de listas e dicionários com maestria. Essa abordagem deixa o código conciso, performático e muito alinhado com o estilo idiomático do Python (o famoso código pythonico).
  • **Uso eficiente do set()**: Na questão 9 e 10, utilizar o set(estados) para descobrir os valores únicos antes de fazer a contagem ou o agrupamento foi uma excelente decisão de oitimização. Isso impede que o Python faça repetições desnecessárias para elementos duplicados.
  • Lógica condicional na List Comprehension: A estrutura da questão 7, criando tuplas com classificações baseadas em múltiplos if-else aninhados dentro de uma linha, ficou fantástica e muito limpa.

Para agregar ainda mais valor ao seu aprendizado e trazer boas práticas utilizadas por equipes de engenharia de dados, gostaria de sugerir duas pequenas otimizações técnicas para você analisar:

  • Questão 9 (Otimização com Counter): O uso de {estado: estados.count(estado) for estado in set(estados)} funciona perfeitamente. Contudo, a função .count() varre a lista inteira para cada estado único. Para listas gigantescas, isso pode ficar lento. Uma alternativa performática do mercado é usar a classe Counter da biblioteca nativa collections, que conta todos os elementos fazendo apenas uma única varredura na lista.
  • Questão 10 (Uso de defaultdict): Na sua abordagem, você criou dois dicionários separados para agrupar e depois somar. É uma lógica muito bem amarrada! Para fazer isso em um único passo sem precisar varrer a lista de funcionários múltiplas vezes para cada estado, podemos utilizar o defaultdict.

Veja um exemplo prático de como essas duas ferramentas nativas podem simplificar as questões 9 e 10:

from collections import Counter, defaultdict

# Otimização para a Questão 9
estados = ['SP', 'ES', 'MG', 'MG', 'SP', 'MG', 'ES', 'ES', 'ES', 'SP', 'SP', 'MG', 'ES', 'SP', 'RJ', 'MG', 'RJ', 'SP', 'MG', 'SP', 'ES', 'SP', 'MG']
contagem_otimizada = dict(Counter(estados))
print(contagem_otimizada)

# Otimização para a Questão 10
funcionarios = [('SP', 16), ('ES', 8), ('MG', 9), ('MG', 6), ('SP', 10), ('MG', 4), ('ES', 9), ('ES', 7), ('ES', 12), ('SP', 7), ('SP', 11), ('MG', 8), ('ES', 8), ('SP', 9), ('RJ', 13), ('MG', 5), ('RJ', 9), ('SP', 12), ('MG', 10), ('SP', 7), ('ES', 14), ('SP', 10), ('MG', 12)]

soma_funcionarios_otimizada = defaultdict(int)
for estado, num in funcionarios:
    soma_funcionarios_otimizada[estado] += num

print(dict(soma_funcionarios_otimizada))

Note como o defaultdict(int) cria automaticamente a chave do estado caso ela não exista e já soma o número diretamente, resolvendo o problema de forma linear e com excelente performance.

Você está avançando com passos muito firmes na trilha de Data Science. Continue com essa consistência nos treinos práticos!

Espero que possa ter lhe ajudado!