8
respostas

Como escrever uma agenda em ordem alfabética de Nomes, se a estrutura dicionário não tem ordem?

Escreva um programa que receba quantas entradas o usuário desejar e depois crie um novo contato para cada entrada (Nome, Telefone, Endereço, Email), e por fim imprima, em ordem alfabética, a agenda de contatos :

Nomes = []
Telefones = []
Endereços = []
Emails = []
Agenda = {"Nome": Nomes,"Telefone":Telefones,"Endereço":Endereços, "Email": Emails}
entrada = ""
while entrada != "s":
    print("Bem-vindo a nossa Agenda!!!!!")
    nome = input("Digite o nome: ")
    Nomes.append(nome)
    telefone = input("Digite o telefone: ")
    Telefones.append(telefone)
    endereço = input("Digite o endereço: ")
    Endereços.append(endereço)
    email = input("Digite o email: ")
    Emails.append(email)
    print(Agenda)
    entrada = input("Deseja sair? ")
    if entrada.lower() == "s":
        print(Agenda)
        break

A agenda é um dicionário e ele não tem ordenação! Como posso imprimir a agenda em ordem alfabética de nomes, seguida das repectivas outras informações (Telefone, Endereço, Email) ?

8 respostas

Oi Edson, tudo bem?

Você pode utilizar a função sorted que ordena um dicionário pelas suas chaves, por exemplo:

for chave, valor in sorted(Agenda):
    print('{} --> {}'.format(chave, valor))

Ou então, ao invés de utilizar um dicionário comum, utilizar um OrderedDict que guarda as informações na ordem que são adicionadas.

Para usar essa classe, vc precisa importar de collections

from collections import OrderedDict

Nomes = []
Telefones = []
Endereços = []
Emails = []
Agenda = OrderedDict()
Agenda['Nome'] = Nomes

Obrigado, Yuri!

Tentei aqui:

Nomes = []
Telefones = []
Endereços = []
Emails = []
Agenda = {"Nome": Nomes,"Telefone":Telefones,"Endereço":Endereços,
          "Email": Emails}
entrada = ""
while entrada != "s":
    print("Bem-vindo a nossa Agenda!!!!!")
    nome = input("Digite o nome: ")
    Nomes.append(nome)
    telefone = input("Digite o telefone: ")
    Telefones.append(telefone)
    endereço = input("Digite o endereço: ")
    Endereços.append(endereço)
    email = input("Digite o email: ")
    Emails.append(email)
    print(Agenda)
    entrada = input("Deseja sair? ")
    if entrada.lower() == "s":
        for chave, valor in sorted(Agenda):
            print('{} --> {}'.format(chave, valor))
            break

Erro:

for chave, valor in sorted(Agenda):
ValueError: too many values to unpack (expected 2)

Não deu certo!

Oi Edson, tudo bem?

O erro pode ser resolvido passando o método items() do dicionário (Agenda.items()):

Nomes = []
Telefones = []
Endereços = []
Emails = []
Agenda = {"Nome": Nomes, "Telefone":Telefones,"Endereço":Endereços,
          "Email": Emails}
entrada = ""
while entrada != "s":
    print("Bem-vindo a nossa Agenda!!!!!")
    nome = input("Digite o nome: ")
    Nomes.append(nome)
    telefone = input("Digite o telefone: ")
    Telefones.append(telefone)
    endereço = input("Digite o endereço: ")
    Endereços.append(endereço)
    email = input("Digite o email: ")
    Emails.append(email)
    print(Agenda)
    entrada = input("Deseja sair? ")
    if entrada.lower() == "s":
        for chave, valor in sorted(Agenda.items()):
            print('{} --> {}'.format(chave, Agenda[chave]))
        break

Oi, Edson! A função sorted() sempre retorna uma lista, então quando você usa sorted(Agenda), o retorno é, na verdade:

['Email', 'Endereço', 'Nome', 'Telefone']

Ou seja, uma lista ordenada das chaves dos dicionários.

Um dicionário que armazena listas de nomes, endereços, telefones e emails talvez não seja a melhor solução pra você. Usando orientação a objetos, você poderia armazenar seus objetos Contato (ou como você queira chamar) em uma lista de agenda. Dessa forma:

class Contato:
    def __init__(self, nome, telefone, endereco, email):
        self.nome = nome
        self.telefone = telefone
        self.endereco = endereco
        self.email = email

primeiro_contato = Contato('Yan', '999', 'R. Alura', 'yan.orestes@alura.com.br')
segundo_contato = Contato('Edson', '111', 'R. Alura', 'edson@mail.com')

agenda = [primeiro_contato, segundo_contato]

Se tentarmos iterar sobre essa agenda com um for e imprimir seus valores, olha como fica:

for contato in agenda:
    print(contato.nome)
    print(contato.telefone)
    print(contato.endereco)
    print(contato.email)

Mas aí olha o resultado:

Yan
999
R. Alura
yan.orestes@alura.com.br
Edson
111
R. Alura
edson@mail.com

Não está ordenado pelo nome, como queremos. Aí a função sorted(), que o Yuri apresentou, pode funcionar muito bem! Basta especificarmos, passando como parâmetro nomeado key, uma função indicando por qual atributo queremos ordenar os nossos objetos (no nosso caso é o nome):

for contato in sorted(agenda, key = lambda c: c.nome):
    print(contato.nome)
    print(contato.telefone)
    print(contato.endereco)
    print(contato.email)

E assim vai dar tudo certo.

Você terminou de ver os cursos de Python que temos aqui na Alura? Talvez fique mais claro quando acabar ^_^. Abraços e bons estudos!

@Yuri Matheus: Muito obrigado pela contribuição! @Yan Orestes: gostei da sua solução. Muito obrigado! Estou rodando a versão do Python 3.5 em Ubuntu Este tópico está muito bom. Aprendi bastante com vocês!

Gostaria apenas de entender o seguinte:

Esta parte do código do @Yuri Matheus, aqui na minha máquina, nao ordenou:

for chave, valor in sorted(Agenda.items()):
            print('{} --> {}'.format(chave, Agenda[chave]))
        break

Imagem -> https://imgur.com/a/sDJgI

O que falta?

Oi Edson, tudo bem?

O método items() dos dicionários devolve, um objeto do tipo dict_items na qual, cada posição é uma tupla com a chave e o valor do dicionário.

Como passamos a função sorted, ela vai ordenar esse dict_items com base no primeiro elemento de cada tupla, que no nosso caso, é a chave do dicionário.

Com a ajuda de vocês, fiz assim:

Nomes = []
Telefones = []
Endereços = []
Emails = []
Agenda = {"Nome": Nomes,"Telefone":Telefones,"Endereço":Endereços,
          "Email": Emails}
entrada = ""

print("Bem-vindo a nossa Agenda!!!!!")
while entrada != "s":

    nome = input("Digite o nome: ")
    Nomes.append(nome)
    telefone = input("Digite o telefone: ")
    Telefones.append(telefone)
    endereço = input("Digite o endereço: ")
    Endereços.append(endereço)
    email = input("Digite o email: ")
    Emails.append(email)
    #print(Agenda)
    entrada = input("Deseja sair? ")
    print()
    if entrada.lower() == "s":
        ordenada = sorted(Agenda['Nome']) #  Cria um lista com os nomes ordenados alfabeticamente
        for nome in ordenada:  # Utiliza o índice do valor da lista para localizá-lo no dicionário
            print()
            print("Nome: ",Agenda['Nome'][Nomes.index(nome)])
            print("Telefone: ",Agenda['Telefone'][Nomes.index(nome)])
            print("Endereço: ",Agenda['Endereço'][Nomes.index(nome)])
            print("Email: ",Agenda['Email'][Nomes.index(nome)])
            print()
        break