Python3 自學筆記 C05【字典】
- 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