Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
1
resposta

Faça como eu fiz: textos, loops e APIs | Python: Inteligência Artificial Aplicada

import random, unicodedata

emails_brutos = [" joao silva ", "MARIA DOS SANTOS", "pedro oliveira", " ana_costa ", "carlos-ferreira"]

print("=" * 60)
print("NORMALIZADOR DE E-MAILS E DADOS".center(60))
print("=" * 60)

def normalizar_nome(texto_bruto):
    texto = texto_bruto.strip()
    texto_nfd = unicodedata.normalize('NFD', texto)
    sem_acentos = ''.join(c for c in texto_nfd if unicodedata.category(c) != 'Mn')
    processado = sem_acentos.lower().replace('-', ' ').replace('_', ' ')
    return ' '.join(processado.split()).title()

print("\nLISTA ORIGINAL:")
for i, nome in enumerate(emails_brutos, 1):
    print(f"  {i}. '{nome}'")

usuarios_normalizados = {}
print("\nPROCESSAMENTO DE NOMES:")

for nome_bruto in emails_brutos:
    nome_limpo = normalizar_nome(nome_bruto)
    usuarios_normalizados[nome_limpo] = {
        "prioridade": random.choice(["URGENTE", "ALTA", "MEDIA", "BAIXA"])
    }
    print(f"  '{nome_bruto.strip()}' -> '{nome_limpo}'")

print("\nDICIONARIO DE USUARIOS:")
for chave, valor in usuarios_normalizados.items():
    print(f"  {chave}: {valor['prioridade']}")

emails_conteudo = [
    {"remetente": "joao.silva", "assunto": "Reuniao sprint", "corpo": "Preciso discutir tarefas proxima semana"},
    {"remetente": "maria.santos", "assunto": "Relatorio mensal", "corpo": "Analise de vendas completa anexada"},
    {"remetente": "pedro.oliveira", "assunto": "Duvida tecnica", "corpo": "Como fazer autenticacao API"},
    {"remetente": "ana.costa", "assunto": "Convite evento", "corpo": "Voce convidado webinar Python"},
    {"remetente": "carlos.ferreira", "assunto": "Feedback projeto", "corpo": "Projeto entregue sucesso prazo"}
]

def resumir_email_api(corpo_email):
    palavras = corpo_email.split()
    palavras_chave = ["urgente", "critico", "sucesso"]
    importancia = sum(1 for p in palavras_chave if p in corpo_email.lower())
    resumo = ' '.join(palavras[:8]) + "..." if len(palavras) > 10 else corpo_email
    sentimento = "Positivo" if "sucesso" in corpo_email.lower() else "Neutro"
    score = min(10, 3 + importancia * 2)
    return {"resumo": resumo, "sentimento": sentimento, "score": score}

print("\n" + "=" * 60)
print("PROCESSAMENTO DE E-MAILS COM API DE RESUMO".center(60))
print("=" * 60)

resumos_processados = []

for numero, email in enumerate(emails_conteudo, 1):
    resultado_api = resumir_email_api(email["corpo"])
    print(f"\nE-MAIL #{numero:02d}")
    print(f"  De: {email['remetente'].upper()}")
    print(f"  Assunto: {email['assunto']}")
    print(f"  Resumo: {resultado_api['resumo']}")
    print(f"  Sentimento: {resultado_api['sentimento']}")
    print(f"  Prioridade: {'*' * resultado_api['score']} ({resultado_api['score']}/10)")
    
    resumos_processados.append({
        "assunto": email["assunto"],
        "prioridade": resultado_api["score"],
        "sentimento": resultado_api["sentimento"]
    })

print("\n" + "=" * 60)
print("RANKING DE URGENCIA".center(60))
print("=" * 60)

resumos_ordenados = sorted(resumos_processados, key=lambda x: x["prioridade"], reverse=True)

for pos in range(len(resumos_ordenados)):
    email = resumos_ordenados[pos]
    percentual = (email["prioridade"] / 10) * 100
    barra = "#" * email["prioridade"] + "-" * (10 - email["prioridade"])
    tipo = "CRITICO" if pos % 2 == 0 else "NORMAL"
    print(f"#{pos+1} [{tipo:6}] {email['assunto'][:20]:20} | {barra} {percentual:5.0f}%")

print("\n" + "=" * 60)
print("SUMARIO EXECUTIVO".center(60))
print("=" * 60)

total = len(emails_conteudo)
urgentes = sum(1 for e in resumos_processados if e["prioridade"] >= 8)
positivos = sum(1 for e in resumos_processados if e["sentimento"] == "Positivo")

print(f"\nTotal de e-mails: {total}")
print(f"E-mails urgentes: {urgentes}")
print(f"E-mails positivos: {positivos}")
print(f"Taxa de positividade: {(positivos/total)*100:.0f}%")

usuarios_com_carga = {}

for nome_normalizado, dados_usuario in usuarios_normalizados.items():
    usuarios_com_carga[nome_normalizado] = {"emails": 0, "prioridade": dados_usuario["prioridade"]}

for email in emails_conteudo:
    remetente = normalizar_nome(email["remetente"])
    for usuario in usuarios_com_carga:
        if usuario.lower().split()[0] in email["remetente"].lower():
            usuarios_com_carga[usuario]["emails"] += 1
            break

carga_total = sum(u["emails"] for u in usuarios_com_carga.values())

print("\n" + "=" * 60)
print("USUARIOS COM CARGA DE TRABALHO".center(60))
print("=" * 60)

for usuario, dados in usuarios_com_carga.items():
    if dados["emails"] > 0:
        carga_pct = (dados["emails"] / carga_total) * 100
        carga_visual = "#" * dados["emails"] + "-" * (5 - dados["emails"])
        print(f"{usuario:20} | {carga_visual} | {carga_pct:5.1f}% | {dados['prioridade']}")

print("\n" + "=" * 60)
print("PROCESSAMENTO CONCLUIDO COM SUCESSO!".center(60))
print("=" * 60)
1 resposta
solução!

Olá, Estudante. Como vai?

Uau! Que excelente implementação. Seu código foi muito além de um script básico, criando um verdadeiro terminal de gerenciamento de dados (dashboard) em formato de texto. É muito bacana ver como você combinou a normalização de strings, estruturas de repetição, simulação de lógica de API e manipulação de dicionários em um único fluxo integrado.

Para contribuir com o seu aprendizado e trazer algumas boas práticas de desenvolvimento em Python, separei alguns pontos técnicos interessantes sobre a sua solução:

1. Robustez na Normalização de Caracteres

A estratégia que você usou na função normalizar_nome utilizando a biblioteca unicodedata com a decomposição NFD é a forma mais profissional e correta de tratar acentuação em Python.

texto_nfd = unicodedata.normalize('NFD', texto)
sem_acentos = ''.join(c for c in texto_nfd if unicodedata.category(c) != 'Mn')
  • O que acontece nos bastidores: O formato NFD separa os caracteres combinados em dois: a letra base (ex: 'a') e o acento (ex: o til '~', que pertence à categoria 'Mn' - Mark, Nonspacing). Ao filtrar e remover essa categoria, você limpa os dados perfeitamente, sem precisar criar dicionários manuais substituindo letra por letra. Excelente escolha técnica!

2. Otimização nos Loops de Associação (Carga de Trabalho)

No trecho final do seu código, você utilizou dois loops aninhados (for dentro de for) para cruzar as informações do remetente do e-mail com as chaves dos usuários normalizados:

for email in emails_conteudo:
    remetente = normalizar_nome(email["remetente"])
    for usuario in usuarios_com_carga:
        if usuario.lower().split()[0] in email["remetente"].lower():
            # ...
  • Sugestão de Boa Prática: Embora funcione muito bem para o volume atual de dados, loops aninhados podem perder desempenho quando a lista de e-mails ou de usuários cresce muito. Uma alternativa mais performática é criar uma chave de busca direta (como o próprio e-mail ou o primeiro nome formatado) mapeada no dicionário desde o início. Assim, você consegue acessar o usuário diretamente com usuarios_com_carga[remetente], eliminando a necessidade do segundo laço.

3. Conectando com APIs de LLM Reais

Na sua função resumir_email_api, você criou uma simulação lógica perfeita de pontuação e resumo. Quando você avançar para a integração com serviços de inteligência artificial reais (como OpenAI, Google Gemini ou Anthropic Claude), a estrutura de repetição que você montou para percorrer a lista continuará idêntica! A única diferença é que o corpo da função fará uma requisição HTTP, aguardando o retorno do texto gerado pela IA.

Parabéns pela dedicação, pela formatação caprichada das saídas no console usando o método .center() e pela organização geral do projeto.

Espero que possa ter lhe ajudado!