2015-06-24 5 views
0

Я создаю простую программу адресной книги в Python. Всякий раз, когда я вводю несколько контактов через меню командной строки, а затем нажмите «b», чтобы перечислить все контакты, отображается только последний контакт, который я ввел. Как я могу заставить программу сохранять все контакты?Как использовать словарь в цикле while?

# Import Collections to use Ordered Dictionary 
import collections 

# The main class 
def main(): 

    # Print the menu for program 
    print """ 
     Contact Book App 
     a) New Contact 
     b) List Contacts 
     c) Search Contacts 
     d) Delete Contact 
     e) Quit 
     """ 
    # Creates an empty ordered dictionary 
    contact = collections.OrderedDict() 

    # Sets the loop as 1 
    loop = 1 

    # Create a while loop for the menu that keeps looping for user input until loop = 0 
    while loop == 1: 

     # Asks for users input from 1-5 
     userInput = raw_input("Please select an option: ").lower() 

     # OPTION 1 : ADD NEW CONTACT 
     if userInput == "a": 
      contact['name'] = raw_input("Enter name: ") 
      contact['phone'] = raw_input("Enter phone: ") 
      contact['email'] = raw_input("Enter email: ") 

      # Confirmation prompt 
      print "Contact Added!" 

      #For Debugging Purposes 
      # print(contact) 

     # OPTION 2 : LIST ALL CONTACTS 
     elif userInput == "b": 
      print "Listing Contacts" 

      print(contact) 

     # OPTION 3 : SEARCH CONTACTS 
     elif userInput == "c": 
      print "Searching Contacts" 
      print "Please Enter Contact Name" 


     # OPTION 4 : DELETE A CONTACT 
     elif userInput == "d": 
      print "Deleting Contact" 

     # OPTION 5 : QUIT PROGRAM 
     elif userInput == "e": 
      print "Quitting Contact Book" 
      loop = 0 
     else: 
      print "I did not understand your input" 
main() 

Вот мой результат:

 Contact Book App 
     a) New Contact 
     b) List Contacts 
     c) Search Contacts 
     d) Delete Contact 
     e) Quit 

Please select an option: a 
Enter name: Dave Smith 
Enter phone: 5553451212 
Enter email: [email protected] 
Contact Added! 
Please select an option: a 
Enter name: John Doe 
Enter phone: 4445433232 
Enter email: [email protected] 
Contact Added! 
Please select an option: b 
Listing Contacts 
OrderedDict([('name', 'John Doe'), ('phone', '4445433232'), ('email', '[email protected]')]) 
Please select an option: 

Как вы можете видеть только последняя запись John Doe появляется и Dave Smith были перезаписаны.

+0

Вы всегда переписываете один и тот же контакт. Вы должны составить список словарей. –

ответ

1

Каждый раз, когда вы попросите пользователя для новых контактных данных, вы перезаписать ранее созданную особую связь. Вместо этого вам необходимо вести список контактов, создавать новый контакт и добавлять его в список. Кроме того, я бы предложил создать class Contact вместо использования словаря.

class Contact: 
    def __init__(self, name, phone, mail): 
     self.name = name 
     self.phone = phone 
     self.mail = mail 
    def __repr__(self): 
     return "Contact(%r, %r, %r)" % (self.name, self.phone, self.mail) 

Кроме того, вы можете использовать break для выхода из цикла вместо того, чтобы использовать переменную. В вашем main (выдержка):

... 
contacts= [] # initialize list of contacts 

while True: 
    userInput = raw_input("Please select an option: ").lower() 

    if userInput == "a": 
     name = raw_input("Enter name: ") 
     phone = raw_input("Enter phone: ") 
     email = raw_input("Enter email: ") 
     contacts.append(Contact(name, phone, email)) # create and add new contact 
     print "Contact Added!" 

    elif userInput == "b": 
     print "Listing Contacts" 
     print(contacts) # use contacts list here 

    ... more options 

    elif userInput == "e": 
     print "Quitting Contact Book" 
     break   # use break here 
    else: 
     print "I did not understand your input" 
+0

Я помещаю класс Contact внутри основной функции или снаружи? – cbandara

+0

@cbandara Извините, забыли упомянуть. Вы должны положить его на улицу. –

2

Составьте список и добавить новые контакты к нему:

contacts = []  
... 
# OPTION 1 : ADD NEW CONTACT 
if userInput == "a": 
    contact = collections.OrderedDict() 
    contact['name'] = raw_input("Enter name: ") 
    contact['phone'] = raw_input("Enter phone: ") 
    contact['email'] = raw_input("Enter email: ") 
    contacts.append(contact) 
... 
+1

Это не сработает - list.append() добавляет ссылку на объект, а не на копию. Каждый раз, когда вы обновляете контактный объект, вы удаляете данные из предыдущих записей. – Kif

+0

О, да, спасибо. Исправлена. – Delimitry

0

Каждый раз, когда вы создаете новую запись в словаре с ключом «имя» вы перезаписать предыдущую. Было бы лучше создать новый список словарей и сохранить каждого человека в качестве отдельного словаря в этом списке.

1
contacts = [] 

# Sets the loop as 1 
loop = 1 

# Create a while loop for the menu that keeps looping for user input until loop = 0 
while loop == 1: 

    # Asks for users input from 1-5 
    userInput = raw_input("Please select an option: ").lower() 

    # OPTION 1 : ADD NEW CONTACT 
    if userInput == "a": 
     contact = collections.OrderedDict() 
     contact['name'] = raw_input("Enter name: ") 
     contact['phone'] = raw_input("Enter phone: ") 
     contact['email'] = raw_input("Enter email: ") 
     contacts.append(contact) 

     # Confirmation prompt 
     print "Contact Added!" 

     #For Debugging Purposes 
     # print(contact) 

    # OPTION 2 : LIST ALL CONTACTS 
    elif userInput == "b": 
     print "Listing Contacts" 

     print(contacts) 

[...]

+0

Спасибо! Перемещение пустого словаря в оператор if, а затем использование списка словарей! – cbandara

+0

Не стесняйтесь отвечать на ответ! :-) – Kif

Смежные вопросы