跳轉到內容

Python 3 非程式設計師教程/字典

來自 Wikibooks,開放世界中的開放書籍

本章節介紹字典。字典包含鍵和值。鍵用於查詢值。以下是一個字典使用的示例

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_menuprint_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如果namenumbers中則返回真,否則返回假。行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]

字典提供了一種將鍵連結到值簡單的方法。這可以用於輕鬆跟蹤附加到各種鍵的資料。

Python 3 非程式設計師教程
 ← 布林表示式 字典 使用模組 → 
華夏公益教科書