2
respostas

[Sugestão] Desafio - Estruturas Condicionais - Questão 09

Pessoal, para quem interessar e quiser testar a capacidade de processamento de dados maiores.

Na questão 09, na eleição com 20 funcionários e 04 candidatos, criei uma função que faz o processamento da eleição, gerando votos aleatórios entre as 06 opções possíveis.

A chamada da função recebe o argumento "Número de funcionários", atraves do quant_funcionários. Daí da pra fazer até com milhões de funcionários, e testar quanto tempo a máquina que você está conectada demora para processar todos os votos e gerar o resultado.

Segue função:

def eleicao(quant_funcionarios):

 #importa a função Random
 import random

 #Criamos uma função que retorna uma lista com o tamanho da quantidade de funcionários, com os votos entre 1-6 escolhidos de maneira aleatória. 
 
 def votos_aleatorios(quant_funcionarios, inicio, fim):
   lista_aleatoria = []
   for _ in range(quant_funcionarios):
     lista_aleatoria.append(random.randint(inicio, fim))
   return lista_aleatoria

 votos = votos_aleatorios(quant_funcionarios,1,6)

 #Declarações iniciais de votos
 candidato1=0
 candidato2=0
 candidato3=0
 candidato4=0
 nulos=0
 brancos=0
 aux=0

 #Capta voto por voto na lista e atribui ao candidato
 while(aux < quant_funcionarios):
     voto=votos[aux]
     if voto == 1:
       candidato1+=1
     elif voto == 2:
       candidato2+=1
     elif voto == 3:
       candidato3+=1
     elif voto == 4:
       candidato4+=1
     elif voto == 5:
       nulos+=1
     elif voto == 6:
       brancos+=1
     else:

 #Calcula a porcentagem de votos nulos e brancos
 por_nulos = nulos/quant_funcionarios*100
 por_brancos = brancos/quant_funcionarios*100

 #Impressões dos resultados
 print(f'RESULTADO DA VOTAÇÃO:\nCandidato 1: {candidato1} votos. \nCandidato 2: {candidato2} votos. \nCandidato 3: {candidato3} votos. \nCandidato 4: {candidato4} votos. ')
 print(f'Votos nulos: {nulos}. \nVotos brancos: {brancos} votos')
 print(f'Total de votos: {quant_funcionarios}')
 print(f'Porcentagem de votos nulos: {por_nulos:.2f}%')
 print(f'Porcentagem de votos brancos: {por_brancos:.2f}%')


 #Coloca o resultado em uma lista
 resultado = [candidato1, candidato2, candidato3, candidato4]

 #Descobre qual a maior quantidade de votos
 mais_votos=max(resultado) 

 #Coloca em uma lista os candidatos que tiveram mais votos
 candidato_vencedor=[]

 for i in range(1,len(resultado)+1):
   if mais_votos == resultado[i-1]:
     candidato_vencedor.append(i)

 #Imprime o vencedor ou vencedores em caso de empate
 if len(candidato_vencedor)>1:
   print('Eleição teve empate. Candidatos vencedores:')
   for i in range (len(candidato_vencedor)):
     print(f'{candidato_vencedor[i]} ')
 else:
   print(f'Eleição não teve empate. O vencedor da eleição foi o candidato: {candidato_vencedor[0]}')

Nosso código também trata o caso que acontece muito com menores quantidades de funcionários, que é o caso do empate.

Podemos chamar a função, por exemplo, com 1 milhão de funcionários, através de

eleicao(1000000)

Aqui demorou menos de 10s para processar.

2 respostas

Ei, Matheus! Tudo bem?

Obrigada por compartilhar o seu código, é muito legal sua iniciativa! Você fez um ótimo trabalho ao estruturar a lógica da eleição, tratando inclusive casos de empate, o que demonstra atenção a detalhes importantes.

Uma sugestão: experimente otimizar o código usando list comprehension na geração dos votos aleatórios, por exemplo:

votos = [random.randint(1, 6) for _ in range(quant_funcionarios)]

Parabéns pelo exercício criativo! Continue se dedicando aos estudos e qualquer dúvida, compartilhe no fórum.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!

Olá, Mateus! Como vai?

Muito bem! Gostei demais da sua abordagem e preocupação com o desempenho do código.

Observei que você explorou o uso de listas e estruturas de repetição para organizar os votos, utilizou muito bem o controle condicional if-elif para contar os votos por categoria e ainda compreendeu a importância do random.randint para gerar dados aleatórios.

Uma dica interessante para o futuro é usar o collections.Counter para contar os votos de forma mais concisa e legível. Dessa forma:

from collections import Counter
import random

quant_funcionarios = 1000
votos = [random.randint(1, 6) for _ in range(quant_funcionarios)]

contagem = Counter(votos)
print(contagem)

Resultado:

Counter({5: 186, 6: 183, 1: 168, 2: 159, 3: 155, 4: 149})

Isso faz a contagem automática de cada número da lista, o que pode simplificar bastante sua lógica de contagem de votos.

Adaptando esse método ao seu código, ficaria assim:

def eleicao(quant_funcionarios):
    import random
    from collections import Counter

    # Função para gerar os votos aleatórios
    def votos_aleatorios(quant_funcionarios, inicio, fim):
        return [random.randint(inicio, fim) for _ in range(quant_funcionarios)]

    votos = votos_aleatorios(quant_funcionarios, 1, 6)

    # Contagem automática com Counter
    contagem = Counter(votos)

    # Recupera os valores de forma segura
    candidato1 = contagem.get(1, 0)
    candidato2 = contagem.get(2, 0)
    candidato3 = contagem.get(3, 0)
    candidato4 = contagem.get(4, 0)
    nulos = contagem.get(5, 0)
    brancos = contagem.get(6, 0)

    por_nulos = nulos / quant_funcionarios * 100
    por_brancos = brancos / quant_funcionarios * 100

    # Impressões dos resultados
    print(f'RESULTADO DA VOTAÇÃO:\nCandidato 1: {candidato1} votos.\nCandidato 2: {candidato2} votos.\nCandidato 3: {candidato3} votos.\nCandidato 4: {candidato4} votos.')
    print(f'Votos nulos: {nulos}.\nVotos brancos: {brancos}')
    print(f'Total de votos: {quant_funcionarios}')
    print(f'Porcentagem de votos nulos: {por_nulos:.2f}%')
    print(f'Porcentagem de votos brancos: {por_brancos:.2f}%')

    # Determina o(s) vencedor(es)
    resultado = [candidato1, candidato2, candidato3, candidato4]
    mais_votos = max(resultado)
    candidato_vencedor = [i + 1 for i, votos in enumerate(resultado) if votos == mais_votos]

    if len(candidato_vencedor) > 1:
        print('Eleição teve empate. Candidatos vencedores:')
        for candidato in candidato_vencedor:
            print(f'{candidato}')
    else:
        print(f'Eleição não teve empate. O vencedor da eleição foi o candidato: {candidato_vencedor[0]}')

# Chamando a função
eleicao(1000)

Resultado:

RESULTADO DA VOTAÇÃO:
Candidato 1: 165 votos.
Candidato 2: 158 votos.
Candidato 3: 187 votos.
Candidato 4: 172 votos.
Votos nulos: 164.
Votos brancos: 154
Total de votos: 1000
Porcentagem de votos nulos: 16.40%
Porcentagem de votos brancos: 15.40%
Eleição não teve empate. O vencedor da eleição foi o candidato: 3

Ou seja, uma contagem mais concisa sem sobrecarregar o código com muitas condicionais.

Ícone de sugestão Para saber mais:

Sugestão de conteúdo para você mergulhar ainda mais sobre o tema:

Alguns materiais estão em inglês, mas é possível compreendê-los usando o recurso de tradução de páginas do próprio navegador.

Abraço e bons estudos!

AluraConte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!