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].
Словари предоставляют простой способ связать ключи со значениями. Это может быть использовано, чтобы просто просмотреть данные, которые соответствуют ключам словаря.