1
resposta

[Projeto] Comparando listas

def preencher_listas(nome: str) -> list[str]:
    """
    Recebe o nome da lista (EX: Lista de Ana)

    Pede para inserir itens na lista e retorna esses itens.
    Caso a lista fique vazia, retorna ao começo.    
    """
    lista = []
    print(f'\nPreenchendo a lista de compras de {nome}:')
    
    while True:        
        item = (input(f'Digite os itens da lista de compras de {nome}: ')).strip()
        if not item:
            print('A lista não pode estar vazia. Tente novamente.')           
            continue
        lista.append(item)
        
        if not continuar_programa(f"Deseja adicionar outro item à lista de {nome}? (s/n): "):
            break
    return lista
          


def continuar_programa(mensagem):
    """
    Recebe uma mensagem personalizada perguntando se o usuário deseja continuar (EX: "Deseja continuar adicionando itens à lista? s/n")
    
    Retorna True para 's' e False para 'n'.
    """
    while True:
        continuar = input(mensagem).strip().lower()

        if continuar in ('s', 'n'):
            return continuar == 's'
        print('Por favor, responda com "s" ou "n".')    



def mostrar_itens_em_comum(listas: dict[str, list[str]]) -> None:
    """
    Recebe o dicionário com as listas e compara elas, mostrando os itens que tem em comum.

    """
    nomes = list(listas.keys())

    for i in range(len(nomes)):
        for j in range(i + 1, len(nomes)):
            nome1 = nomes[i]
            nome2 = nomes[j]

            set1 = set(map(str.lower, listas[nome1]))
            set2 = set(map(str.lower, listas[nome2]))

            comuns = set1 & set2
            if comuns:
                print('\nItens em ambas as listas: ')
                for item in sorted(comuns):
                    print(f'- {item}')
            else:
                print(f'As listas de {nome1} e {nome2} não possui itens em comum.')



def main():
    listas = {}
    while True:
        nome = input('Digite o dono da lista de compras: ').strip().capitalize()
        if not nome:
            print('O nome não pode estar vazio')
            continue
        if not nome.isalpha():
            print('O nome deve conter apenas letras (sem números ou símbolos).')
            continue
        

        listas[nome] = preencher_listas(nome)

        if not continuar_programa("Deseja criar outra lista de compras? (s/n): "):
            break
    print("\nListas de compras: ")
    for pessoa, itens in listas.items():
        print(f'\nLista de {pessoa}: ')
        for item in itens:
            print(f'- {item}')

    mostrar_itens_em_comum(listas)



if __name__ == '__main__':
    main()
1 resposta

Oi, Matheus! Como vai?

Seu código está muito bem estruturado! A forma como você organizou as funções, principalmente separando a lógica de preenchimento, validação e exibição dos itens em comum, mostra um excelente domínio dos conceitos de funções e dicionários em Python.

Uma dica interessante para o futuro é usar o método .title(), que formata uma string deixando a primeira letra de cada palavra em maiúscula. Isso pode ser útil, por exemplo, na hora de padronizar os nomes dos donos das listas. Veja este exemplo:


nome = input('Digite seu nome: ').strip().title()
print(nome)

Esse código garante que, se alguém digitar "ana maria", será exibido "Ana Maria". Isso ajuda na organização dos dados.

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