Python 3 非程式設計師教程/字典
本章節介紹字典。字典包含鍵和值。鍵用於查詢值。以下是一個字典使用的示例
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():
print("Name:", x, "\tNumber:", numbers[x])
遍歷字典並列印所有資訊。函式numbers.keys()返回一個列表,然後由for迴圈使用。keys()返回的列表沒有特定的順序,因此如果您希望按字母順序排列,則必須對其進行排序。與列表類似,語句numbers[x]用於訪問字典的特定成員。當然,在這種情況下,x是一個字串。接下來,行numbers[name] = phone將名稱和電話號碼新增到字典中。如果name已存在於字典中,則phone將替換之前存在的內容。接下來,這些行
if name in numbers:
del numbers[name]
檢查字典中是否存在名稱,如果存在則將其刪除。運算子name in numbers如果name在numbers中則返回真,否則返回假。行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的值就是這個)(我使用鍵#Max,因為#在任何字母字元之前排序)。接下來定義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)
請注意,首先在行keys = list(students.keys())中使用keys函式從students字典中獲取鍵。keys是可迭代的,它被轉換為列表,以便所有列表函式都可以對其使用。接下來,在行keys.sort()中對鍵進行排序。for用於遍歷所有鍵。成績作為列表儲存在字典中,因此賦值grades = students[x]使grades成為儲存在鍵x處的列表。函式print_grades只打印一個列表,並在幾行後定義。
程式的後面幾行實現了選單的各種選項。行students[name] = [0] * len(max_points)將學生新增到其姓名的鍵下。符號[0] * len(max_points)只是建立一個與max_points列表長度相同的0列表。
刪除學生條目只需刪除學生,類似於電話簿示例。記錄成績選擇稍微複雜一些。在行grades = students[name]中檢索成績,獲取學生name的成績的引用。然後在行grades[which] = grade中記錄成績。您可能會注意到grades從未放回學生字典中(就像沒有students[name] = grades一樣)。缺少該語句的原因是grades實際上是students[name]的另一個名稱,因此更改grades會更改student[name]。
字典提供了一種將鍵連結到值簡單的方法。這可以用於輕鬆跟蹤附加到各種鍵的資料。