def print_menu(): print '1. Print Phone Numbers' print '2. Add a Phone Number' print '3. Remove a Phone Number' print '4. Lookup a Phone Number' print '5. Quit' print numbers = {} menu_choice = 0 print_menu() while menu_choice != 5: menu_choice = input("Type in a number (1-5):") if menu_choice == 1: print "Telephone Numbers:" for x in numbers.keys(): print "Name: ",x," \tNumber: ",numbers[x] print elif menu_choice == 2: print "Add Name and Number" name = raw_input("Name:") phone = raw_input("Number:") numbers[name] = phone elif menu_choice == 3: print "Remove Name and Number" name = raw_input("Name:") if numbers.has_key(name): del numbers[name] else: print name," was not found" elif menu_choice == 4: print "Lookup Number" name = raw_input("Name:") if numbers.has_key(name): print "The number is",numbers[name] else: print name," was not found" elif menu_choice != 5: print_menu()Вот что я получил, когда запустил программу:
1. Print Phone Numbers 2. Add a Phone Number 3. Remove a Phone Number 4. Lookup a Phone Number 5. Quit Type in a number (1-5):2 Add Name and Number Name:Joe Number:545-4464 Type in a number (1-5):2 Add Name and Number Name:Jill Number:979-4654 Type in a number (1-5):2 Add Name and Number Name:Fred Number:132-9874 Type in a number (1-5):1 Telephone Numbers: Name: Jill Number: 979-4654 Name: Joe Number: 545-4464 Name: Fred Number: 132-9874 Type in a number (1-5):4 Lookup Number Name:Joe The number is 545-4464 Type in a number (1-5):3 Remove Name and Number Name:Fred Type in a number (1-5):1 Telephone Numbers: Name: Jill Number: 979-4654 Name: Joe Number: 545-4464 Type in a number (1-5):5Эта программа похожа на ту, которую мы рассматривали в главе, посвященной спискам. Вот как она работает. Сначала определяется функция print_menu. Она просто выводит пользовательское меню, и дважды используется далее в программе. Затем идет странная команда numbers = {}. Все, что она делает – сообщает, что numbers – это словарь. Несколько следующих команд определяют работу пользовательского меню. Команды
for x in numbers.keys(): print "Name: ",x," \tNumber: ",numbers[x]просматривают словарь и выводят всю информацию. Функция numbers.keys() выдает список, который используется в цикле for. Список, выданный функцией keys, выводится без упорядочивания, поэтому его надо отсортировать, если вы хотите получить его в алфавитном порядке. Аналогично спискам, выражение numbers[x] используется для доступа к определенному элементу словаря. Конечно, в этом случае x – это строка. Далее команда numbers[name] = phone добавляет имя и номер телефона к словарю. Если name уже есть в словаре, новое значение phone просто заменит то, что там было раньше. Следующие команды:
if numbers.has_key(name): del numbers[name]проверяют, есть ли имя в словаре, и, если да, убирают его. Функция numbers.has_key(name) выдает истинно, если в словаре numbers есть имя name, и выдает ложно в противном случае. Команда del numbers[name] удаляет имя и номер, соответствующий ей. Команды
if numbers.has_key(name): print "The number is",numbers[name]проверяют, есть ли ключ в словаре, и, если да, выводят номер, соответствующий ему. Наконец, если вы сделали неправильный выбор в пользовательском меню, программа снова выводит пользовательское меню для вашего удовольствия.
Итак, словари содержат ключи и значения. Ключами могут быть строки или числа. Ключи указывают на значения. Значениями могут быть любые типы, включая списки и даже словари (конечно, эти списки и словари, в свою очередь могут содержать другие списки и словари – страшно, не правда ли?). Пример использования списка в словаре:
max_points = [25,25,50,25,100] assignments = ['hw ch 1','hw ch 2','quiz ','hw ch 3','test'] students = {'#Max':max_points} def print_menu(): print "1. Add student" print "2. Remove student" print "3. Print grades" print "4. Record grade" print "5. Print Menu" print "6. Exit"
def print_all_grades(): print '\t', for i in range(len(assignments)): print assignments[i],'\t', print keys = students.keys() keys.sort() for x in keys: print x,'\t', grades = students[x] print_grades(grades)
def print_grades(grades): for i in range(len(grades)): print grades[i],'\t\t', print
print_menu() menu_choice = 0 while menu_choice != 6: print menu_choice = input("Menu Choice (1-6):") if menu_choice == 1: name = raw_input("Student to add:") students[name] = [0]*len(max_points) elif menu_choice == 2: name = raw_input("Student to remove:") if students.has_key(name): del students[name] else: print "Student: ",name," not found" elif menu_choice == 3: print_all_grades() elif menu_choice == 4: print "Record Grade" name = raw_input("Student:") if students.has_key(name): grades = students[name] print "Type in the number of the grade to record" print "Type a 0 (zero) to exit" for i in range(len(assignments)): print i+1,' ',assignments[i],'\t', print print_grades(grades) which = 1234 while which != -1: which = input("Change which Grade:") which = which-1 if 0 <= which < len(grades): grade = input("Grade:") grades[which] = grade elif which != -1: print "Invalid Grade Number" else: print "Student not found" elif menu_choice != 6: print_menu()Пример результата:
1. Add student 2. Remove student 3. Print grades 4. Record grade 5. Print Menu 6. Exit Menu Choice (1-6):3 hw ch 1 hw ch 2 quiz hw ch 3 test #Max 25 25 50 25 100
Menu Choice (1-6):6 1. Add student 2. Remove student 3. Print grades 4. Record grade 5. Print Menu 6. Exit Menu Choice (1-6):1 Student to add:Bill
Menu Choice (1-6):4 Record Grade Student:Bill Type in the number of the grade to record Type a 0 (zero) to exit 1 hw ch 1 2 hw ch 2 3 quiz 4 hw ch 3 5 test 0 0 0 0 0 Change which Grade:1 Grade:25 Change which Grade:2 Grade:24 Change which Grade:3 Grade:45 Change which Grade:4 Grade:23 Change which Grade:5 Grade:95 Change which Grade:0
Menu Choice (1-6):3 hw ch 1 hw ch 2 quiz hw ch 3 test #Max 25 25 50 25 100 Bill 25 24 45 23 95 Menu Choice (1-6):6Вот как работает программа. Переменная students – это словарь, где ключи – это фамилии студентов, а значения – их оценки. Первые две команды создают два списка. Следующая команда students = {'#Max':max_points} создает новый словарь с ключом #Max и значением [25,25,50,25,100] (поскольку это то, что было присвоено в список max_points). Имя #Max используется, поскольку # идет раньше букв алфавита при сортировке. Далее определяется функция print_menu. После этого функция print_all_grades определяется следующим образом:
def print_all_grades(): print '\t', for i in range(len(assignments)): print assignments[i],'\t', print keys = students.keys() keys.sort() for x in keys: print x,'\t', grades = students[x] print_grades(grades)Обратите внимание, сначала мы извлекаем ключи из словаря students с помощью функции keys: keys = students.keys(). keys – это список, поэтому все функции работы со списками могут быть использованы с ним. Мы сортируем keys функцией keys.sort(), так как это список. Затем мы используем цикл for для прохождения всего списка. Оценки – это список, содержащийся в словаре, поэтому команда grades = students[x] присваивает в grades список, соответствующий ключу x в словаре. Функция print_grades, которая просто выводит список, определяется несколькими строками ниже.
Дальнейшие команды программы определяют обработку различных вариантов выбора в пользовательском меню. Команда students[name] = [0]*len(max_points) добавляет в словарь студента с ключом по его имени. Выражение [0]*len(max_points) просто создает список с нулями такого же размера, как и список max_points.
Чтобы удалить студента, делаем то же, что и в примере с телефонной книгой, приведенном выше. Обработка выбора «Record grade» из пользовательского меню немного сложнее. Оценки получают командой grades = students[name]. При этом переменная grades получает оценки студента, соответствующего name. Затем введенная оценка сохраняется в программе командой grades[which] = grade. Возможно, вы заметили, что grades не записывается назад в словарь students (то есть, нигде нет команды students[name] = grades). Причина этому – то, что grades – просто другое имя для students[name], поэтому при изменении grades меняется students[name].
Словари предоставляют простой способ связать ключи со значениями. Это может быть использовано, чтобы просто просмотреть данные, которые соответствуют ключам словаря.