1. 程式人生 > >Python3 自學筆記 C05【字典】

Python3 自學筆記 C05【字典】

Python3 自學筆記第五章【字典】

- 5.1 一個簡單的字典

fruits = {'apple' : 'red' , 'number' : 5}
print(fruits['apple'])
print(fruits['number'])

輸出結果如下:

red
5

在Python中,字典是一系列鍵-值對。每個鍵都與一個值相關聯,你可以使用鍵來訪問與之相關聯的值。與鍵相關聯的值可以是數字、字串、列表乃至字典。事實上,可以將任何Python物件用作字典中的值。鍵-值對是兩個相關聯的值。在指定鍵時,Python將返回與之相關聯的值。鍵和值之間用冒號分隔,而鍵-值對之間用逗號分隔。在字典中,想儲存多少個鍵-值對

都可以

- 5.1.1 訪問字典中的值

要獲取與鍵相關聯的值,可依次指定字典名和放在方括號內的鍵:

fruits = {'apple' : 'red' , 'number' : 5}
number_fruits = fruits['number']
print("The number of apple is " + str(number_fruits) + "!")

輸出結果如下:

The number of apple is 5!

- 5.1.2 新增鍵-值對

字典是一種動態結構,可隨時在其中新增鍵-值對。要新增鍵-值對,可依次指定字典名、用方括號括起來的鍵和相關聯的值

fruits =
{'apple' : 'red' , 'number1' : 5} print(fruits) fruits['banana'] = 'yellow' fruits['number2'] = 13 print(fruits)

輸出結果如下:

{'apple': 'red', 'number1': 5}
{'apple': 'red', 'number1': 5, 'banana': 'yellow', 'number2': 13}

注意:鍵-值對的排列順序與新增順序不同。Python不關心鍵-值對的新增順序,而只關心鍵和值之間的關聯關係

有時候為了方便也可以先使用一對空的花括號定義一個字典,再分行新增各個鍵-值對:

fruits = {}
fruits['banana'] = 'yellow'
fruits['number2'] = 13
print(fruits)

輸出結果如下:

{'banana': 'yellow', 'number2': 13}

- 5.1.3 修改字典中的值

要修改字典中的值,可依次指定字典名、用方括號括起來的鍵以及與該鍵相關聯的新值

fruits = {'color' : 'red'}
print("The color of the fruits is " + fruits['color'] + "!")
fruits['color'] = 'yellow'
print("The color of the fruits is " + fruits['color'] + " now!")

輸出結果如下:

The color of the fruits is red!
The color of the fruits is yellow now!

進階:對一個能夠以不同速度移動的外星人的位置進行跟蹤,為此,我們將儲存該外星人的當前速度,並據此確定該外星人將向右移動多遠:

alien = {'x_position': 0, 'y_position': 25, 'speed': 'medium'}
print("Original x-position: " + str(alien['x_position']))

#向右移動外星人,據外星人當前速度決定將其移動多遠
if alien['speed'] == 'slow':
    x_increment = 1
elif alien['speed'] == 'medium':
    x_increment = 2
else:
    x_increment = 3

#新位置等於老位置加上增量
alien['x_position'] = alien['x_position'] + x_increment
print("New x_position: " + str(alien['x_position']))

輸出結果如下:

Original x-position: 0
New x_position: 2

- 5.1.4 刪除鍵-值對

對於字典中不再需要的資訊,可使用del語句將相應的鍵-值對徹底刪除。使用del語句時,必須指定字典名和要刪除的鍵

fruits = {'apple' : 'red' , 'number' : 5}
print(fruits)
del fruits['number']
print(fruits)

輸出結果如下:

{'apple': 'red', 'number': 5}
{'apple': 'red'}

- 5.1.5 由類似物件組成的字典

字典儲存的可以是一個物件的多種資訊,也可以儲存眾多物件的同一種資訊,例如要調查很多人最喜歡的程式語言:

favorite_languages = {
    'jen' : 'python' ,
    'sarah' : 'c' ,
    'edward' : 'ruby' ,
    'phil' : 'java' ,
    }
print("Sarah's favorite languages is " + favorite_languages['sarah'].title() + "!")

輸出結果如下:

Sarah's favorite languages is C!

- 5.2 遍歷字典

- 5.2.1 方法 items() 遍歷所有的鍵-值對

使用for迴圈來遍歷字典:

name = {
    'username' : 'efermi' ,
    'first' : 'enrico' ,
    'last' : 'fermi' ,
    }
for key , value in name.items():
    print("\nKey: " + key)
    print("Value: " + value)

輸出結果如下:


Key: username
Value: efermi

Key: first
Value: enrico

Key: last
Value: fermi

for語句的第二部分包含字典和方法items(),它返回一個鍵-值對列表。接下來,for迴圈依次將每個鍵-值對儲存到指定的兩個變數中

favorite_languages = {
    'jen' : 'python' ,
    'sarah' : 'c' ,
    'edward' : 'ruby' ,
    'phil' : 'java' ,
    }
for name, language in favorite_languages.items():
    print(name.title() + "'s favorite language is " + language.title() + ".")

輸出結果如下:

Jen's favorite language is Python.
Sarah's favorite language is C.
Edward's favorite language is Ruby.
Phil's favorite language is Java.

- 5.2.2 方法 keys() 遍歷字典中所有的鍵

在不需要使用字典中的值時,方法key()很有用,下面來遍歷字典favorite_languages,並將每個被調查者的名字都打印出來:

favorite_languages = {
    'jen' : 'python' ,
    'sarah' : 'c' ,
    'edward' : 'ruby' ,
    'phil' : 'java' ,
    }
for name in favorite_languages.keys():
    print(name.title())

輸出結果如下:

Jen
Sarah
Edward
Phil

遍歷字典時,會預設遍歷所有的鍵,因此,如果將上述程式碼中的for name in favorite_languages.keys():替換為for name in favorite_languages:輸出結果將不變 進階:

favorite_languages = {
    'jen' : 'python' ,
    'sarah' : 'c' ,
    'edward' : 'ruby' ,
    'phil' : 'java' ,
    }
friends = ['phil', 'sarah']
for name in favorite_languages.keys():
    print(name.title())
    if name in friends:
        print("Hi " + name + ", I see your favorite languages is " + favorite_languages[name].title() + "!")

輸出結果如下:

Jen
Sarah
Hi sarah, I see your favorite languages is C!
Edward
Phil
Hi phil, I see your favorite languages is Java!

- 5.2.3 函式 sorted() 按順序遍歷字典中的所有鍵

字典總是明確地記錄鍵和值之間的關聯關係,但獲取字典的元素時,獲取順序是不可預測的,要以特定的順序返回元素,一種辦法是在for迴圈中對返回的鍵進行排序,為此,可以使用函式sorted()來獲得按特定順序排列的鍵列表的副本:

favorite_languages = {
    'jen' : 'python' ,
    'sarah' : 'c' ,
    'edward' : 'ruby' ,
    'phil' : 'java' ,
    }
for name in sorted(favorite_languages.keys()):
    print(name.title())

輸出結果如下:

Edward
Jen
Phil
Sarah

- 5.2.4 方法 values() 遍歷字典中的所有值

favorite_languages = {
    'jen' : 'python' ,
    'sarah' : 'c' ,
    'edward' : 'ruby' ,
    'phil' : 'java' ,
    }
for languages in favorite_languages.values():
    print(languages.title())

輸出結果如下:

Python
C
Ruby
Java

這種做法提取字典中所有的值,而沒有考慮是否重複,為剔除重複項,可使用集合(set),集合類似於列表,但每個元素都必須是獨一無二的:

favorite_languages = {
    'jen' : 'python' ,
    'sarah' : 'c' ,
    'edward' : 'ruby' ,
    'phil' : 'python' ,
    }
for languages in set(favorite_languages.values()):
    print(languages.title())

輸出結果如下:

C
Python
Ruby

- 5.3 巢狀

有時候,需要將一系列字典儲存在列表中,或將列表作為值儲存在字典中,這稱為巢狀。可以在列表中巢狀字典、在字典中巢狀列表甚至在字典中巢狀字典

- 5.3.1 字典列表

下面程式碼建立三個字典,每個字典都表示一個個學生,將這三個字典都放到一個名為students的列表當中,遍歷列表將每個學生都打印出來:

student_0 = {'name' : 'anily' , 'class' : 2}
student_1 = {'name' : 'nikey' , 'class' : 5}
student_2 = {'name' : 'heyk' , 'class' : 3}
students = [student_0 , student_1 , student_2]
for student in students:
    print(student)

輸出結果如下:

{'name': 'anily', 'class': 2}
{'name': 'nikey', 'class': 5}
{'name': 'heyk', 'class': 3}

進階:使用 range() 自動生成三十個外星人:

#建立一個用於儲存外星人的空列表
aliens = []

#建立三十個綠色的外星人
for alien_number in range(30):
    new_alien = {'color' : 'green' , 'points' : 5 , 'speed' : 'slow'}
    aliens.append(new_alien)

#顯示前五個外星人
for alien in aliens[:5]:
    print(alien)
print("......")

#顯示建立了多少外星人
print("Total number of aliens: " + str(len(aliens)))

輸出結果如下:

{'color': 'green', 'points': 5, 'speed': 'slow'}
{'color': 'green', 'points': 5, 'speed': 'slow'}
{'color': 'green', 'points': 5, 'speed': 'slow'}
{'color': 'green', 'points': 5, 'speed': 'slow'}
{'color': 'green', 'points': 5, 'speed': 'slow'}
......
Total number of aliens: 30

在上述例子中,雖然每個外星人都具有相同特徵,但在Python看來,每個外星人都是獨立的,我們可以獨立地修改每個外星人:

aliens = []
for alien_number in range(30):
    new_alien = {'color' : 'green' , 'points' : 5 , 'speed' : 'slow'}
    aliens.append(new_alien)
for alien in aliens[0:3]:
    if alien['color'] == 'green':
        alien['color'] = 'yellow'
        alien['points'] = 10
        alien['speed'] = 'medium'
for alien in aliens[:5]:
    print(alien)
print("......")
print("Total number of aliens: " + str(len(aliens)))

輸出結果如下:

{'color': 'yellow', 'points': 10, 'speed': 'medium'}
{'color': 'yellow', 'points': 10, 'speed': 'medium'}
{'color': 'yellow', 'points': 10, 'speed': 'medium'}
{'color': 'green', 'points': 5, 'speed': 'slow'}
{'color': 'green', 'points': 5, 'speed': 'slow'}
......
Total number of aliens: 30

- 5.3.2 在字典中儲存列表

有時候需要將列表儲存在字典中,而不是將字典儲存在列表中: 例一:

#儲存所點比薩的資訊
pizza = {
    'crust' : 'thick' ,
    'toppings' : ['mushrooms' , 'extra chees'] ,
    }

#概述所點的比薩
print("You ordered a " + pizza['crust'] + "-crust pizza" + "with the following toppings :" )
for topping in pizza['toppings']:
    print("\t" + topping)

輸出結果如下:

You ordered a thick-crust pizzawith the following toppings :
	mushrooms
	extra chees

例二:

favorite_languages = {
    'jen' : ['python' , 'ruby'] ,
    'sarah' : ['c'] ,
    'edward' : ['go' , 'ruby'] ,
    'phil' : ['python' , 'java'] ,
    }
for name , languages in favorite_languages.items():
    print("\n" + name.title() + "'s favorite languages are:")
    for language in languages:
        print("\t" + language.title())

輸出結果如下:


Jen's favorite languages are:
	Python
	Ruby

Sarah's favorite languages are:
	C

Edward's favorite languages are:
	Go
	Ruby

Phil's favorite languages are:
	Python
	Java

- 5.3.3 在字典中儲存字典

users = {
    'aeinstein' : {
        'first' : 'albert' ,
        'last' : 'einstein' ,
        'location' : 'princeton' ,
        } ,
    'mcurie' : {
        'first' : 'marie' ,
        'last' : 'curie' ,
        'location' : 'paris' ,
        } ,
    }
for username , user_info in users.items():
    print("\nUsername : " + username)
    full_name = user_info['first'] + " " + user_info['last']
    location = user_info['location']
    print("\tFull name : " + full_name.title())
    print("\tlocation : " + location .title())

輸出結果如下:


Username : aeinstein
	Full name : Albert Einstein
	location : Princeton

Username : mcurie
	Full name : Marie Curie
	location : Paris