本章内容是关于字典的。字典有键(keys)和值(values)。键用于查找对应的值。下面是一个字典使用的示例:


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 = int(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 = input("Name: ")
        phone = input("Number: ")
        numbers[name] = phone
    elif menu_choice == 3:
        print("Remove Name and Number")
        name = input("Name: ")
        if name in numbers:
            del numbers[name]
        else:
            print(name, "was not found")
    elif menu_choice == 4:
        print("Lookup Number")
        name = input("Name: ")
        if name in numbers:
            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 函数。print_menu 只是打印一个菜单,稍后会在程序中使用两次。接下来是看起来有点奇怪的一行代码 numbers = {}。这一行的作用是告诉 Python numbers 是一个字典。接下来的几行代码就是让菜单工作起来。

对于字典的使用,for x in numbers.keys() 语句用于遍历字典,并打印所有信息。numbers.keys() 函数返回一个列表,接着 for 循环使用这个列表。keys() 返回的列表没有特定顺序,因此如果需要按字母顺序排列,必须进行排序。类似于列表,numbers[x] 语句用于访问字典中的特定成员。当然,在此例中,x 是一个字符串。接下来,numbers[name] = phone 语句将姓名和电话号码添加到字典中。如果该姓名已经存在于字典中,那么 phone 将替代原来的电话号码。

接下来的语句:

if name in numbers:
    del numbers[name]

用于检查某个姓名是否存在于字典中,如果存在,则删除该姓名。name in numbers 操作符在 name 存在时返回 True,否则返回 Falsedel numbers[name] 语句会删除与 name 相关的键值对。

然后,以下语句:

if name in numbers:
    print("The number is", numbers[name])

用于检查字典中是否存在某个键,如果存在,则打印该键对应的值(电话号码)。最后,如果菜单选择无效,程序会重新打印菜单。

总结: 字典由键和值组成。键可以是字符串或数字,键指向值。值可以是任何类型的变量(包括列表,甚至字典),并且这些列表或字典本身也可以包含字典或列表(这有点吓人,对吧? smile)。下面是一个在字典中使用列表的例子:


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', end=' ')
    for i in range(len(assignments)):
        print(assignments[i], '\t', end=' ')
    print()
    keys = list(students.keys())
    keys.sort()
    for x in keys:
        print(x, '\t', end=' ')
        grades = students[x]
        print_grades(grades)

def print_grades(grades):
    for i in range(len(grades)):
        print(grades[i], '\t', end=' ')
    print()

print_menu()
menu_choice = 0
while menu_choice != 6:
    print()
    menu_choice = int(input("Menu Choice (1-6): "))
    if menu_choice == 1:
        name = input("Student to add: ")
        students[name] = [0] * len(max_points)
    elif menu_choice == 2:
        name = input("Student to remove: ")
        if name in students:
            del students[name]
        else:
            print("Student:", name, "not found")
    elif menu_choice == 3:
        print_all_grades()
    elif menu_choice == 4:
        print("Record Grade")
        name = input("Student: ")
        if name in students:
            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', end=' ')
            print()
            print_grades(grades)
            which = 1234
            while which != -1:
                which = int(input("Change which Grade: "))
                which -= 1    #same as which = which - 1
                if 0 <= which < len(grades):
                    grade = int(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): 5
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 列表的内容)。接下来定义了 print_menu 函数。然后定义了 print_all_grades 函数,代码如下:

def print_all_grades():
    print('\t',end=" ")
    for i in range(len(assignments)):
        print(assignments[i], '\t',end=" ")
    print()
    keys = list(students.keys())
    keys.sort()
    for x in keys:
        print(x, '\t',end=' ')
        grades = students[x]
        print_grades(grades)

首先,使用 students.keys() 获取字典中的所有键,并将其转换为列表 keys = list(students.keys())。然后,使用 keys.sort() 对这些键进行排序。接着,for 循环遍历这些键,获取相应的成绩并打印。

程序的后续部分实现了菜单的不同选项。students[name] = [0] * len(max_points) 用于为学生添加姓名并初始化成绩。[0] * len(max_points) 会创建一个与 max_points 列表长度相同的全零列表。

删除学生与电话簿示例类似。record grades 选项稍微复杂一些。成绩通过 grades = students[name] 获取,并在 grades[which] = grade 中进行录入。需要注意的是,grades 本质上是 students[name] 的引用,因此更改 grades 会直接影响字典 students

字典提供了一种简便的方式来将键与值关联,可以方便地跟踪与各种键相关的数据。

Last modified: Sunday, 2 February 2025, 11:48 PM