Python的非程序员教程3
本章内容是关于字典的。字典有键(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
,否则返回 False
。del
numbers[name]
语句会删除与 name
相关的键值对。
然后,以下语句:
if name in numbers:
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', 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
。
字典提供了一种简便的方式来将键与值关联,可以方便地跟踪与各种键相关的数据。