Keywords: easytut

Далее: Использование модулей Наверх: Курс языка 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]`.

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

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