Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Exercicios Projetos 10

  1. Nessa mesma tabela de cadastro de filiais, há uma coluna com as informações da quantidade de pessoas colaboradoras e o(a) gestor(a) gostaria de ter um agrupamento da soma dessas pessoas para cada estado. As informações contidas na tabela sã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)]
    A partir da lista de tuplas, crie um dicionário em que as chaves são os nomes dos Estados únicos e os valores são as listas com o número de colaboradores(as) referentes ao Estado. Crie também um dicionário em que as chaves são os nomes dos Estados e os valores são a soma de colaboradores(as) por Estado.
    Dica: Você pode fazer um passo intermediário para gerar uma lista de listas em que cada uma das listas possui apenas os valores numéricos de funcionários(as) de cada Estado.
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)]
estados_unicos = list(set([tupla[0] for tupla in funcionarios]))

lista_de_listas = []

for estado in estados_unicos:
  lista = [tupla[1] for tupla in funcionarios if tupla[0] == estado]
  lista_de_listas.append(lista)
print(lista_de_listas)

agrupamento_por_estado = {estados_unicos[i] : lista_de_listas[i] for i in range(len(estados_unicos))}
print(agrupamento_por_estado)

soma_por_estado = {estados_unicos[i] : sum(lista_de_listas[i]) for i in range(len(estados_unicos))}
print(soma_por_estado)

Essa ultima questão fiz com base na correção, pois achei ela muito confusa, foi a que mais tive dificuldade, então copiei para tentar entender com clareza, apesar de ainda estar achando nebulosa. Quem puder me explicar a questão de forma passo a passo para melhor compreenssão ficaria agradecida.

2 respostas

Tudo bem, Valentina?

Que bom que você está revisando e buscando entender melhor a lógica por trás da solução, isso é super importante! A dificuldade nessa atividade é comum, pois envolve manipular estruturas de dados de formas diferentes para chegar ao resultado final.

Sobre a explicação, segue abaixo:

1 - Dados iniciais: uma lista de tuplas
Temos uma lista chamada funcionarios, onde cada tupla representa:

  • Primeiro item (tupla[0]): o estado (sigla)
  • Segundo item (tupla[1]): o número de colaboradores nessa unidade
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)
]

Dica: Pense em cada tupla como uma linha de uma planilha:
('SP', 16) → "São Paulo tem 16 colaboradores"

2 - Objetivo 1: Extrair os estados únicos (sem repetição)

Queremos uma lista com os estados que aparecem, sem duplicatas:

estados_unicos = list(set([tupla[0] for tupla in funcionarios]))

Como funciona?

- [tupla[0] for tupla in funcionarios] → percorre cada tupla e pega apenas o estado

  • set(...) → remove duplicatas (conjunto não aceita repetição)
  • list(...) → transforma de volta em lista

3 - Objetivo 2: Criar uma lista com os colaboradores de cada estado

Monta-se uma lista de listas, onde cada sublista contém os números de colaboradores de um estado:

lista_de_listas = []
for estado in estados_unicos:
    lista = [tupla[1] for tupla in funcionarios if tupla[0] == estado]
    lista_de_listas.append(lista)
  • Para cada estado em estados_unicos:
  • Filtra todas as tuplas onde o estado bate → pega apenas o número de colaboradores (tupla[1])
  • Guarda essa lista temporária e adiciona na lista_de_listas

4 - Objetivo 3: Montar um dicionário com estado → lista de colaboradores

Associação de cada estado à sua lista de colaboradores:

agrupamento_por_estado = {
    estados_unicos[i]: lista_de_listas[i] 
    for i in range(len(estados_unicos))
}

Usamos o índice i para parear:

  • estados_unicos[i] → chave (ex: 'SP')
  • lista_de_listas[i] → valor (ex: [16, 10, 7, ...])

5 - Objetivo 4: Calcular a soma total de colaboradores por estado

Finalmente, somamos os valores de cada lista:

soma_por_estado = {
    estados_unicos[i]: sum(lista_de_listas[i]) 
    for i in range(len(estados_unicos))
}
  • sum(lista_de_listas[i]) → soma todos os números da lista do estado
  • Criamos um dicionário com estado → total de colaboradores

Espero ter ajudado e qualquer dúvida, compartilhe no fórum.

Até mais!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado!

solução!

Oi, Valentina! Tudo bem?

Eu resolvi antes de ler na resolução do professor da forma abaixo. Também é a primeira vez que vejo e achei bem confuso mas preferi fazer de um jeito mais "passo-a-passo" pra ajudar a memorizar. Vou te explicar como fiz:

Primeiro, eu fiz a questão 9 desse jeito:

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

# Minha primeira resolução desse desafio:
sp = [sigla for sigla in estados if sigla == 'SP']
es = [sigla for sigla in estados if sigla == 'ES']
mg = [sigla for sigla in estados if sigla == 'MG']
rj = [sigla for sigla in estados if sigla == 'RJ']
lista = [siglas for siglas in [sp, es, mg, rj]]

filiais_dict = {lista[i][0]: len(lista[i]) for i in range(0, len(lista))}

filiais_dict['Total'] = len(estados)

print(filiais_dict)

Pra 9, eu resolvi contar quantas das siglas se repetem, montar listas com elas e contar o tamanho de cada lista, por isso criei a variável lista. Concordo que ficou um tanto verboso, mas depois de mais acostumado eu posso tentar deixar mais "enxuto". Assim, eu resolvi a questão 10 da seguinte forma:

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)]

es = [tupla[1] for tupla in funcionarios if tupla[0] == 'ES']
sp = [tupla[1] for tupla in funcionarios if tupla[0] == 'SP']
rj = [tupla[1] for tupla in funcionarios if tupla[0] == 'RJ']
mg = [tupla[1] for tupla in funcionarios if tupla[0] == 'MG']

lista_de_listas = [numeros for numeros in [es, sp, rj, mg]]

filiais_uf = [siglas[0] for siglas in lista]

funcionarios_filiais_dict = {filiais_uf[i]: lista_de_listas[i] for i in range(0, len(lista_de_listas))}

print(f'Quantidade de funcionários por filiais nos estados:\n{funcionarios_filiais_dict}\n')

soma_funcionarios_ufs = {filiais_uf[i]: sum(lista_de_listas[i]) for i in range(0, len(lista_de_listas))}

print(f'Somatório de funcionários por estados:\n{soma_funcionarios_ufs}')

Destrinchando, eu separei primeiramente em listas os números de cada estado colocando cada lista em uma variável nomeada por cada UF:

es = [tupla[1] for tupla in funcionarios if tupla[0] == 'ES']

Eu costumo ler uma list comprehension da seguinte forma: "na lista funcionarios (in funcionarios), cada item, que eu chamarei de tupla, retornará o valor da posição 1 da tupla (tupla[1]) caso o valor da posição 0 da tupla (tupla[0]) seja igual a ES" (if tupla[0] == 'ES').

Isso me ajuda a entender o passo-a-passo. Foi bem orientado ao que o professor fez nas aulas quando ele substituía os nomes dos itens pelos nomes das variáveis. Assim, se eu passar print(es) aparecerá:

[8, 9, 7, 12, 8, 14]

Depois, eu montei uma única lista com todas essas listas seguindo a ordem estabelecida pela sequência de variáveis:

lista_de_listas = [numeros for numeros in [es, sp, rj, mg]]

Leia-se: "na lista de variáveis (in [es, sp, rj, mg]), retorne cada lista criada, que chamarei de numeros (numeros for numeros). O que apareceria no print(lista_de_listas) seria:

[[8, 9, 7, 12, 8, 14], [16, 10, 7, 11, 9, 12, 7, 10], [13, 9], [9, 6, 4, 8, 5, 10, 12]]

A seguir, eu aproveitei a variável lista que eu montei na questão anterior pra criar uma variável com as UFs de cada estado, onde eu pego apenas o primeiro valor de cada lista contendo apenas a sigla de cada estado:

filiais_uf = [siglas[0] for siglas in lista]

E assim, montei o dicionário pedido pela primeira parte da questão:

funcionarios_filiais_dict = {filiais_uf[i]: lista_de_listas[i] for i in range(0, len(lista_de_listas))}

Eu tento ler uma dict comprehension do mesmo jeito que fiz com a list: "numa contagem de itens que vai do 0 até o 3, (for i in range(0, len(lista_de_listas))), nomeie a chave da cada item do dicionário pela UF (filiais_uf[i]) e seu respectivo valor com a lista de quantidade de funcionários (lista_de_listas[i])".

Por estarem na mesma posição (i), eles se encontrarão e formarão o seguinte dicionário:

{'ES': [8, 9, 7, 12, 8, 14], 'SP': [16, 10, 7, 11, 9, 12, 7, 10], 'RJ': [13, 9], 'MG': [9, 6, 4, 8, 5, 10, 12]}

Para a segunda parte do enunciado, apenas repliquei o dict comprehension anterior e usei um sum(lista_de_listas) como valor de cada chave:

soma_funcionarios_ufs = {filiais_uf[i]: sum(lista_de_listas[i]) for i in range(0, len(lista_de_listas))}

Dessa forma, o resultado foi:

{'ES': 58, 'SP': 82, 'RJ': 22, 'MG': 54}

Desculpa pelo código mais "verboso", mas acredito que pode ajudar a "ler melhor" esse conteúdo que realmente assusta mais no primeiro contato.