next up previous contents
Далее: Использование модулей Наверх: Курс языка Python для начинающих Назад: Логические выражения   Содержание

Словари

Эта глава посвящена словарям. В словарях есть ключи и значения. С помощью ключей находят значения. Пример использования словарей:
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].

Словари предоставляют простой способ связать ключи со значениями. Это может быть использовано, чтобы просто просмотреть данные, которые соответствуют ключам словаря.


next up previous contents
Далее: Использование модулей Наверх: Курс языка Python для начинающих Назад: Логические выражения   Содержание
Джош Коглиати jjc@honors.montana.edu Версия Wikibooks: Курс языка Python Для начинающих на Wikibooks