
一、使用字典
一個簡單的字典

字典是一系列鍵——值對。每個鍵都與一個值相關聯,可以使用鍵來訪問與之相關聯的值。與鍵相關聯的值可以是數字、字符串、列表乃至字典。事實上,可將任何Python對象用作字典中的值。
在Python中,字典用放在花括號{}中的一系列鍵——值對表示。
鍵——值對是兩個相關聯的值。指定鍵時,Python將返回與之相關聯的值。鍵和值之間用冒號分隔,而鍵——值對之間用逗號分隔。在字典中,想存儲多少個鍵——值對都可以。最簡單的字典只有一個鍵——值對。
1、訪問字典中的值
要獲取與鍵相關聯的值,可依次指定字典名和放在方括號內的鍵。
字典中可包含任意數量的鍵——值對。

str(new_points)是將得到的5轉換成字符串
2、添加鍵——值對
字典是一種動態結構,可隨時在其中添加鍵——值對。要添加鍵——值對,可依次指定字典名、用方括號括起的鍵和相關聯的值。

鍵—值對的排列順序與添加順序不同。(書上是這么寫的,但是為啥我的順序相同)
Python不關心鍵——值對的添加順序,而只關心鍵和值之間的關聯關系。
3、先創建一個空字典
有時候,在空字典中添加鍵—值對是為了方便,而有時候必須這樣做。為此,可先使用一對空的花括號定義一個字典,再分行添加各個鍵——值對。

使用字典來存儲用戶提供的數據或在編寫能自動生成大量鍵——值對的代碼時,通常都需要先定義一個空字典。
4、 修改字典中的值
要修改字典中的值,可依次指定字典名、用方括號括起的鍵以及與該鍵相關聯的新值。


5、刪除鍵——值對
對于字典中不再需要的信息,可使用del語句將相應的鍵—值對徹底刪除。使用del語句時,必須指定字典名和要刪除的鍵。

del(alien_0['points'])換成del alien_0['points']也行
刪除的鍵—值對永遠消失了
6、由類似對象組成的字典
可以使用字典來存儲眾多對象的同一種信息
定義好字典后,在最后一個鍵—值對的下一行添加一個右花括號,并縮進四個空格,使其與字典中的鍵對齊。另外一種不錯的做法是在最后一個鍵—值對后面也加上逗號,為以后在下一行添加鍵—值對做好準備。

將較長的print語句分成多行:

二、遍歷字典
一個Python字典可能只包含幾個鍵—值對,也可能包含數百萬個鍵—值對。鑒于字典可能包含大量的數據,Python支持對字典遍歷。字典可用于以各種方式存儲信息,因此有多種遍歷字典的方式:可遍歷字典的所有鍵—值對、鍵或值。
1、遍歷所有的鍵——值對

要編寫用于遍歷字典的for循環,可聲明兩個變量,用于存儲鍵—值對中的鍵和值。對于這兩個變量,可使用任何名稱。
上面for語句中包含字典名和方法items(),它返回一個鍵—值對列表。
即便遍歷字典時,鍵—值對的返回順序也與存儲順序不同(我這里還是相同)。Python不關心鍵—值對的存儲順序,而只跟蹤鍵和值之間的關聯關系。

2、 遍歷字典中的所有鍵
在不需要使用字典中的值時,方法keys()很有用。

遍歷字典時,會默認遍歷所有的鍵,因此,如果將上述代碼中的for name in favorite_language.keys():替換為for name in favorite_language:輸出將不變。顯式地使用方法keys()可讓代碼更容易理解。



3、按順序遍歷字典中的所有鍵
字典總是明確地記錄鍵和值之間的關聯關系,但獲取字典的元素時,獲取順序是不可預測的。這不是問題,因為通常你想要的只是獲取與鍵相關聯的正確的值。
要以特定的順序返回元素,一種辦法是在for循環中對返回的鍵進行排序。為此,可使用函數sorted()來獲得按特定順序排列的鍵列表的副本。

4、遍歷字典中的所有值
方法values()返回一個值列表,而不包含任何鍵。

這種做法提取字典中所有的值,而沒有考慮是否重復。涉及的值很少時,這也許不是問題,但如果被調查者很多,最終的列表可能包含大量的重復項。
為剔除重復項,可使用集合(set)。集合類似于列表,但每個元素都必須是獨一無二的。

通過對包含重復元素的列表調用set()可讓Python找出列表中獨一無二的元素,并使用這些元素來創建一個集合。
三、 嵌套
有時需要將一系列字典存儲在列表中,或將列表作為值存儲在字典中,這稱為嵌套。你可以在列表中嵌套字典、在字典中嵌套列表甚至在字典中嵌套字典。
1、字典列表




經常需要在列表中包含大量的字典,而其中每個字典都包含特定對象的眾多信息。
2、在字典中存儲列表

每當需要在字典中將一個鍵關聯到多個值時,都可以在字典中嵌套一個列表。


3、在字典中存儲字典


#6-1人
#使用一個字典來存儲一個熟人的信息,包括名、姓、年齡和居住的城市。
#該字典應包含鍵first_name、last_name、age和city。
#將存儲在該字典中的每項信息都打印出來。
people = {'first_name':'Si','last_name':'Zhao','age':40,'city':'Tieling',}
print("The first_name is "+people['first_name']+".")
print("The last_name is "+people['last_name']+".")
print("His name is "+people['last_name']+" "+people['first_name']+".")
print("He is "+str(people['age'])+" yesrs old.")
print("He is living in "+people['city']+" now.")#6-2喜歡的數字
#使用一個字典來存儲一些人喜歡的數字
#請想出5個人的名字,并將這些名字用作字典中的鍵
#想出每個人喜歡的一個數字,并將這些數字作為值存儲在字典中
#打印每個人的名字和喜歡的數字
#為讓這個程序更有趣,通過詢問朋友確保數據是真實的。
numbers = {'alice':'4','bob':'5','ken':'9','james':'8','june':'3',}
print("Alice's favorite number is "+numbers['alice']+".")
print("Bob's favorite number is "+numbers['bob']+".")
print("ken's favorite number is "+numbers['ken']+".")
print("James's favorite number is "+numbers['james']+".")
print("June's favorite number is "+numbers['june']+".")#6-3詞匯表
#Python字典可用于模擬現實生活中的字典,但為避免混淆,我們將后者稱為詞匯表。
#想出你在前面學過的5個編程詞匯,將它們用作詞匯表中的鍵,并將它們的含義作為值存儲在詞匯表中。
#以整潔的方式打印每個詞匯及其含義。
#為此,你可以先打印詞匯,在它后面加上一個冒號,再打印詞匯的含義;
#也可在一行打印詞匯,再使用換行符(n)插入一個空行,然后在下一行以縮進的方式打印詞匯的含義。
cihui = {'列表':'是基本數據結構','字典':'一系列鍵——值對','變量':'不確定值的量','函數':'完成特定功能的程序','編譯':'把高級語言編程二進制語言',
}
print("列表"+":"+cihui['列表'])
print("字典"+":"+cihui['字典'])
print("變量"+":"+cihui['變量'])
print("函數"+":"+cihui['函數'])
print("編譯"+":"+cihui['編譯'])#6-4詞匯表2
#既然你知道了如何遍歷字典,現在請整理你為完成練習6-3而編寫的代碼
#將其中的一系列print語句替換為一個遍歷字典中的鍵和值的循環。
cihui = {'list':'是基本數據結構','dict':'一系列鍵——值對','var':'不確定值的量','fun':'完成特定功能的程序','com':'把高級語言編程二進制語言',
}
for key, value in cihui.items():print(key+": "+value)#6-5河流
#創建一個字典,在其中存儲三條大河流及其流經的國家。
#其中一個鍵—值對可能是'nile': 'egypt'。
#使用循環為每條河流打印一條消息,如“The Nile runs through Egypt.”。
#使用循環將該字典中每條河流的名字都打印出來。
#使用循環將該字典包含的每個國家的名字都打印出來。
rivers = {'nile': 'egypt','changjiang': 'china','huanghe': 'china'
}
for river, country in rivers.items():print("The "+river.title()+" runs through "+country.title()+".")
for river in rivers.keys():print(river.title())
for country in rivers.values():print(country.title())#6-6調查
#在6.3.1節編寫的程序favorite_languages.py中執行以下操作
#創建一個應該會接受調查的人員名單,其中有些人已包含在字典中,而其他人未包含在字典中。
#遍歷這個人員名單,對于已參與調查的人,打印一條消息表示感謝
#對于還未參與調查的人,打印一條消息邀請他參與調查。
favorite_language = {'jen': 'python','sarah': 'c','edward': 'ruby','phil': 'python',}
wei = ['erin', 'june', 'bob']
for name in favorite_language:print(name.title()+", thank you for taking for the poll.")
for name in wei:if name not in favorite_language:print("Hi "+name.title()+", I'm inviting you to take the poll.")#6-7人
#在為完成練習6-1而編寫的程序中,再創建兩個表示人的字典
#然后將這三個字典都存儲在一個名為people的列表中
#遍歷這個列表,將其中每個人的所有信息都打印出來。
people_0 = {'first_name':'Si','last_name':'Zhao','age':40,'city':'Tieling',}
people_1 = {'first_name':'Xing','last_name':'Wang','age':20,'city':'Beijing',}
people_2 = {'first_name':'La','last_name':'La','age':35,'city':'Shenyang',}
people = [people_0, people_1, people_2]
for person in people:print(person)#6-8寵物
#創建多個字典,對于每個字典,都使用一個寵物的名稱來給它命名
#在每個字典中,包含寵物的類型及其主人的名字
#將這些字典存儲在一個名為pets的列表中
#再遍歷該列表,并將寵物的所有信息都打印出來
pet_0 = {'type':'cat','zhuren':'alice'
}
pet_1 = {'type':'dog','zhuren':'bob'
}
pets = [pet_0, pet_1]
for pet in pets:print(pet)#6-9喜歡的地方
#創建一個名為favorite_places的字典
#在這個字典中,將三個人的名字用作鍵
#對于其中的每個人,都存儲他喜歡的1~3個地方
#遍歷這個字典,并將其中每個人的名字及其喜歡的地方打印出來
favorite_places = {'alice':['hangzhou', 'sanya'],'bob':['yunnan','chongqing'],'june':['sichuan', 'caoyuan', 'dalian']
}
for name, places in favorite_places.items():print("n"+name.title()+"'s favorite places are: ")for place in places:print(place.title())#6-10喜歡的數字
#修改為完成練習6-2而編寫的程序
#讓每個人都可以有多個喜歡的數字
#然后將每個人的名字及其喜歡的數字打印出來
numbers = {'alice':['4','6','9'],'bob':['5','4','7','9'],'ken':['2','5','8'],'james':['8','6','4'],'june':['3','6','9'],}
for name, numbers in numbers.items():print(name.title()+"'s favorite numbers are:")for number in numbers:print(number)#6-11城市
#創建一個名為cities的字典,其中將三個城市名用作鍵
#對于每座城市,都創建一個字典,并在其中包含該城市所屬的國家、人口約數以及一個有關該城市的事實
#在表示每座城市的字典中,應包含country、population和fact等鍵
#將每座城市的名字以及有關它們的信息都打印出來
cities = {'sanya':{'country':'china','population':300000,'fact':'nanfang',},'yunnan':{'country':'china','population':5000000,'fact':'nanfang',},'dalian':{'country':'china','population':200000,'fact':'beifang',},
}
for city_name, city_info in cities.items():print("nCity:"+city_name.title())population = city_info['population']fact = city_info['fact']print("t有"+ str(population) +"人口")print("t在"+fact)