【Python 1-11】Python手把手教程之——字典的用法和對字典的管理

作者 | 弗拉德
來源 | 弗拉德(公眾號:fulade_me)

字典

字典是另一種可變?nèi)萜髂P颓骼鳎铱纱鎯θ我忸愋蛯ο笥洹W值涞拿總€鍵值 key=>value對用冒號:分割,每個鍵值對之間用逗號,分割,整個字典包括在花括號{}中沿侈。

使用字典

在Python中,字典是一系列鍵—值對市栗。每個鍵都與一個值相關(guān)聯(lián)缀拭,你可以使用鍵來訪問與之相關(guān)聯(lián)的值。與鍵相關(guān)聯(lián)的值可以是數(shù)字填帽、字符串蛛淋、列表乃至字典。事實上篡腌,可將任何Python對象用作字典中的值褐荷。
來看一個游戲,其中包含一些外星人嘹悼,這些外星人的顏色和點數(shù)各不相同叛甫,如下所示:

alien_0 = {'color': 'green', 'points': 5}

鍵—值對是兩個相關(guān)聯(lián)的值层宫。指定鍵時,Python將返回與之相關(guān)聯(lián)的值其监。鍵和值之間用冒號分隔萌腿,而鍵—值對之間用逗號分隔。在字典中抖苦,你想存儲多少個鍵—值對都可以毁菱。
最簡單的字典只有一個鍵—值對,如下述修改后的字典alien_0所示:

alien_0 = {'color': 'green'}

這個字典只存儲了一項有關(guān)alien_0的信息锌历,具體地說是這個外星人的顏色鼎俘。在這個字典中,字符串color是一個鍵辩涝,與之相關(guān)聯(lián)的值為green贸伐。

訪問字典中的值

要獲取與鍵相關(guān)聯(lián)的值,可依次指定字典名和放在方括號內(nèi)的鍵怔揩,如下所示:

alien_0 = {'color': 'green'}
print(alien_0['color'])

這將返回字典alien_0中與鍵color相關(guān)聯(lián)的值:

green

字典中可包含任意數(shù)量的鍵—值對捉邢。例如,下面是最初的字典alien_0商膊,其中包含兩個鍵— 值對:

alien_0 = {'color': 'green', 'points': 5}

現(xiàn)在伏伐,你可以訪問外星人alien_0的顏色和點數(shù)。如果玩家射殺了這個外星人晕拆,你就可以使用下面的代碼來確定玩家應(yīng)獲得多少個點:

alien_0 = {'color': 'green', 'points': 5}
new_points = alien_0['points']
print("You just earned " + str(new_points) + " points!")

上述代碼首先定義了一個字典藐翎,然后從這個字典中獲取與鍵points相關(guān)聯(lián)的值,并將這個值存儲在變量new_points中实幕。接下來吝镣,將這個整數(shù)轉(zhuǎn)換為字符串,并打印一條消息昆庇,指出玩家獲得了多少個點:

You just earned 5 points!

添加鍵—值對

字典是一種動態(tài)結(jié)構(gòu)末贾,可隨時在其中添加鍵—值對。要添加鍵—值對整吆,可依次指定字典名拱撵、用方括號括起的鍵和相關(guān)聯(lián)的值。
下面在字典alien_0中添加兩項信息:

外星人的x坐標(biāo)和y坐標(biāo)表蝙,讓我們能夠在屏幕的特定位置顯示該外星人拴测。我們將這個外星人放在屏幕左邊緣,且離屏幕上邊緣25像素的地方府蛇。由于屏幕坐標(biāo)系的原點通常為左上角集索,因此要將該外星人放在屏幕左邊緣,可將x坐標(biāo)設(shè)置為0,要將該外星人放在離屏幕頂部25像素的地方抄谐,可將y坐標(biāo)設(shè)置為25,如下所示:

alien_0 = {'color': 'green', 'points': 5}
print(alien_0)
alien_0['x_position'] = 0 
alien_0['y_position'] = 25
print(alien_0)

我們首先定義了前面一直在使用的字典扰法,然后打印這個字典蛹含,以顯示其信息快照。我們在這個字典中新增了一個鍵—值對塞颁,其中的鍵為x_position浦箱,而值為0。接著我們重復(fù)這樣的操作祠锣,但使用的鍵為y_position酷窥。打印修改后的字典時,將看到這兩個新增的鍵—值對:

{'color': 'green', 'points': 5}
{'color': 'green', 'points': 5, 'y_position': 25, 'x_position': 0}

這個字典的最終版本包含四個鍵—值對伴网,其中原來的兩個指定外星人的顏色和點數(shù)蓬推,而新增的兩個指定位置。注意澡腾,鍵—值對的排列順序與添加順序不同沸伏。Python不關(guān)心鍵—值對的添加順序,而只關(guān)心鍵和值之間的關(guān)聯(lián)關(guān)系动分。

創(chuàng)建空字典

有時候毅糟,在空字典中添加鍵—值對是為了方便,而有時候必須這樣做澜公。為此姆另,可先使用一對空的花括號定義一個字典,再分行添加各個鍵—值對坟乾。例如迹辐,下例演示了如何以這種方式創(chuàng)建字典alien_0:

alien_0 = {}
alien_0['color'] = 'green' 
alien_0['points'] = 5
print(alien_0)

這里首先定義了空字典alien_0,再在其中添加顏色和點數(shù)甚侣,得到前述示例一直在使用的字典:

{'color': 'green', 'points': 5}

使用字典來存儲用戶提供的數(shù)據(jù)或在編寫能自動生成大量鍵—值對的代碼時右核,通常都需要先定義一個空字典。

修改字典中的值

要修改字典中的值渺绒,可依次指定字典名贺喝、用方括號括起的鍵以及與該鍵相關(guān)聯(lián)的新值。
例如宗兼,假設(shè)隨著游戲的進(jìn)行躏鱼,需要將一個外星人從綠色改為黃色:

alien_0 = {'color': 'green'}
print("The alien is " + alien_0['color'] + ".")
alien_0['color'] = 'yellow'
print("The alien is now " + alien_0['color'] + ".")

我們首先定義了一個表示外星人alien_0的字典,其中只包含這個外星人的顏色殷绍。接下來染苛,我們將與鍵color相關(guān)聯(lián)的值改為yellow。輸出表明,這個外星人確實從綠色變成了黃色:

The alien is green.
The alien is now yellow.

來看一個更有趣的例子茶行,對一個能夠以不同速度移動的外星人的位置進(jìn)行跟蹤躯概。我們將存儲該外星人的當(dāng)前速度,并據(jù)此確定該外星人將向右移動多遠(yuǎn):

alien_0 = {'x_position': 0, 'y_position': 25, 'speed': 'medium'} 
print("Original x-position: " + str(alien_0['x_position']))
# 向右移動外星人
# 據(jù)外星人當(dāng)前速度決定將其移動多遠(yuǎn) 
if alien_0['speed'] == 'slow':
    x_increment = 1
elif alien_0['speed'] == 'medium':
    x_increment = 2 
else:
# 這個外星人的速度一定很快 
    x_increment = 3
# 新位置等于老位置加上增量
alien_0['x_position'] = alien_0['x_position'] + x_increment
print("New x-position: " + str(alien_0['x_position']))

我們首先定義了一個外星人畔师,其中包含初始的x坐標(biāo)和y坐標(biāo)娶靡,還有速度medium。出于簡化考慮看锉,我們省略了顏色和點數(shù)姿锭,但即便包含這些鍵值對,這個示例的工作原理也不會有任何變化伯铣。我們還打印了x_position的初始值呻此,這讓用戶知道這個外星人向右移動了多遠(yuǎn)。
然后腔寡,使用了一個if-elif-else結(jié)構(gòu)來確定外星人應(yīng)向右移動多遠(yuǎn)焚鲜,并將這個值存儲在變量x_increment中。如果外星人的速度為slow放前,它將向右移動一個單位恃泪,如果速度為medium,將向右移動兩個單位犀斋,如果為fast贝乎,將向右移動三個單位。確定移動量后叽粹,將其與x_position的當(dāng)前值相加览效,再將結(jié)果關(guān)聯(lián)到字典中的鍵x_position
由于這是一個速度中等的外星人虫几,因此其位置將向右移動兩個單位:

Original x-position: 0
New x-position: 2

通過修改外星人字典中的值锤灿,可改變外星人的行為。例如辆脸,要將這個速度中等的外星人變成速度很快的外星人但校,可添加如下代碼行:

alien_0['speed'] = fast 

這樣,再次運(yùn)行這些代碼時啡氢,其中的if-elif-else結(jié)構(gòu)將把一個更大的值賦給變量
x_increment状囱。

刪除鍵—值對

對于字典中不再需要的信息,可使用del語句將相應(yīng)的鍵—值對徹底刪除倘是。使用del語句時亭枷,必須指定字典名和要刪除的鍵。
例如搀崭,下面的代碼從字典alien_0中刪除鍵points及其值:

alien_0 = {'color': 'green', 'points': 5}
print(alien_0)
del alien_0['points'] 
print(alien_0)

上述代碼將鍵points從字典alien_0中刪除叨粘,同時刪除與這個鍵相關(guān)聯(lián)的值。輸出表明,鍵points及其值5已從字典中刪除升敲,但其他鍵—值對不受影響:

{'color': 'green', 'points': 5}
{'color': 'green'}

遍歷字典

一個Python字典可能只包含幾個鍵—值對答倡,也可能包含數(shù)百萬個鍵—值對。鑒于字典可能包含大量的數(shù)據(jù)驴党,Python支持對字典遍歷瘪撇。字典可用于以各種方式存儲信息,因此有多種遍歷字典的方式鼻弧,可遍歷字典的所有鍵—值對设江、鍵或值锦茁。

遍歷所有的鍵—值對

探索各種遍歷方法前攘轩,先來看一個新字典,它用于存儲有關(guān)網(wǎng)站用戶的信息码俩。下面的字典存儲一名用戶的用戶名度帮、名和姓:

user_0 = {
    'username': 
    'efermi', 
    'first': 
    'enrico', 
    'last': 
    'fermi',
}

我們可以使用一個for循環(huán)來遍歷這個字典:

for key, value in user_0.items(): 
    print("\nKey: " + key)
    print("Value: " + value)

要實現(xiàn)遍歷字典的for循環(huán),可聲明兩個變量稿存,用于存儲鍵—值對中的鍵和值笨篷。 對于這兩個變量,可使用任何名稱瓣履。下面的代碼使用了簡單的變量名率翅,這完全可行:

for k, v in user_0.items()

for語句的第二部分包含字典名和方法items(),它返回一個鍵—值對列表袖迎。接下來冕臭,for循環(huán)依次將每個鍵—值對存儲到指定的兩個變量中。我們使用這兩個變量來打印每個鍵及其相關(guān)聯(lián)的值燕锥。第一條print語句中的"\n"確保在輸出每個鍵—值對前都插入一個空行:

Key: last 
Value: fermi

Key: first 
Value: enrico

Key: username 
Value: efermi

即便遍歷字典時辜贵,鍵—值對的返回順序也與存儲順序不同。Python不關(guān)心鍵—值對的存儲順序归形,而只跟蹤鍵和值之間的關(guān)聯(lián)關(guān)系托慨。

遍歷字典中的所有鍵

在不需要使用字典中的值時,方法keys()很有用暇榴。下面來遍歷字典favorite_languages厚棵,并將每個被調(diào)查者的名字都打印出來:

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

.keys()方法提取字典favorite_languages中的所有鍵,并依次將它們存儲到變量name中蔼紧。輸出列出了每個被調(diào)查者的名字:

Jen 
Sarah 
Phil 
Edward

遍歷字典時窟感,會默認(rèn)遍歷所有的鍵,因此歉井,如果將上述代碼中的for name in favorite_ languages.keys():替換為for name in favorite_languages:柿祈,輸出將不變。如果顯式地使用方法keys()可讓代碼更容易理解,你可以選擇這樣做躏嚎,也可省略它蜜自。在這種循環(huán)中,可使用當(dāng)前鍵來訪問與之相關(guān)聯(lián)的值卢佣。

下面來打印兩條消息重荠,指出兩位朋友喜歡的語言。我們像前面一樣遍歷字典中的名字虚茶,但在名字為指定朋友的名字時戈鲁,打印一條消息,指出其喜歡的語言:

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

我們創(chuàng)建了一個列表嘹叫,其中包含我們要通過打印消息婆殿,指出其喜歡的語言的朋友。 在循環(huán)中罩扇,我們打印每個人的名字婆芦,并檢查當(dāng)前的名字是否在列表friends中
如果在列表中喂饥,就打印一句特殊的問候語消约,其中包含這位朋友喜歡的語言。為訪問喜歡的語言员帮,我們使用了字典名或粮,并將變量name的當(dāng)前值作為鍵。每個人的名字都會被打印捞高,但只對朋友打印特殊消息:

Jen
Sarah
 Hi Sarah, I see your favorite language is C!
Edward
Phil
 Hi Phil, I see your favorite language is Python!

按順序遍歷字典中的所有鍵

字典總是明確地記錄鍵和值之間的關(guān)聯(lián)關(guān)系氯材,但獲取字典的元素時,獲取順序是不可預(yù)測的棠枉。
要以特定的順序返回元素浓体,一種辦法是在for循環(huán)中對返回的鍵進(jìn)行排序”惭龋可使用函數(shù)sorted()來獲得按特定順序排列的鍵列表的副本:

favorite_languages = { 'jen': 'python','sarah': 'c','edward': 'ruby','phil': 'python'}
for name in sorted(favorite_languages.keys()):
    print(name.title() + ", thank you for taking the poll.")

這個示例中命浴,對方法dictionary.keys()的結(jié)果調(diào)用了函數(shù)sorted()。 這讓Python列出字典中的所有鍵贱除,并在遍歷前對這個列表進(jìn)行排序生闲。輸出表明,按順序顯示了所有被調(diào)查者的名字:

Edward, thank you for taking the poll. 
Jen, thank you for taking the poll. 
Phil, thank you for taking the poll. 
Sarah, thank you for taking the poll.

遍歷字典中的所有值

如果你只想知道字典包含的值月幌,可使用方法values()碍讯,它返回一個值列表,而不包含任何鍵扯躺。
例如捉兴,如果我們想獲得一個這樣的列表蝎困,即其中只包含被調(diào)查者選擇的各種語言,而不包含被調(diào)查者的名字倍啥,可以這樣做:

favorite_languages = { 'jen': 'python','sarah': 'c', 'edward': 'ruby', 'phil': 'python'}
print("The following languages have been mentioned:")  
for language in favorite_languages.values():
    print(language.title())

這條for語句提取字典中的每個值禾乘,并將它們依次存儲到變量language中。通過打印這些值虽缕,就獲得了一個列表始藕,其中包含被調(diào)查者選擇的各種語言:

The following languages have been mentioned: 
Python
C
Python
Ruby

這種做法提取字典中所有的值,而沒有考慮是否重復(fù)氮趋。涉及的值很少時伍派,這也許不是問題,但如果被調(diào)查者很多剩胁,最終的列表可能包含大量的重復(fù)項诉植。為剔除重復(fù)項,我們可使用集合set摧冀。 集合類似于列表倍踪,但每個元素都必須是獨一無二的:

favorite_languages = { 'jen': 'python',
'sarah': 'c', 'edward': 'ruby', 'phil': 'python', }
print("The following languages have been mentioned:")
    for language in set(favorite_languages.values()): 
        print(language.title())

通過對包含重復(fù)元素的列表調(diào)用set()系宫,可以幫我們找出列表中獨一無二的元素索昂,并使用這些元素來創(chuàng)建一個集合。我們使用了set()來提取favorite_languages.values()中不同的語言扩借。
結(jié)果是一個不重復(fù)的列表椒惨,其中列出了被調(diào)查者提及的所有語言:

The following languages have been mentioned: 
Python
C
Ruby

嵌套

有時候,需要將一系列字典存儲在列表中潮罪,或?qū)⒘斜碜鳛橹荡鎯υ谧值渲锌底唬@稱為嵌套。你可以在列表中嵌套字典嫉到、在字典中嵌套列表甚至在字典中嵌套字典沃暗,嵌套是一項強(qiáng)大的功能。

字典列表

字典alien_0包含一個外星人的各種信息何恶,但無法存儲第二個外星人的信息孽锥,更別說屏幕上全部外星人的信息了。如何管理成群結(jié)隊的外星人呢?一種辦法是創(chuàng)建一個外星人列表细层,其中每個外星人都是一個字典惜辑,包含有關(guān)該外星人的各種信息。
例如疫赎,下面的代碼創(chuàng)建一個包含三個外 星人的列表:

alien_0 = {'color': 'green', 'points': 5}
alien_1 = {'color': 'yellow', 'points': 10}
alien_2 = {'color': 'red', 'points': 15}
aliens = [alien_0, alien_1, alien_2]
for alien in aliens:
    print(alien)

我們首先創(chuàng)建了三個字典盛撑,其中每個字典都表示一個外星人。我們將這些字典都放到一個名為aliens的列表中捧搞。最后抵卫,我們遍歷這個列表狮荔,并將每個外星人都打印出來:

{'color': 'green', 'points': 5} 
{'color': 'yellow', 'points': 10} 
{'color': 'red', 'points': 15}

更符合現(xiàn)實的情形是,外星人不止三個介粘,且每個外星人都是使用代碼自動生成的轴合。在下面的示例中,我們使用range()生成了30個外星人:

# 創(chuàng)建一個用于存儲外星人的空列表 
aliens = []
# 創(chuàng)建30個綠色的外星人
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) 
    # 顯示創(chuàng)建了多少個外星人
print("Total number of aliens: " + str(len(aliens)))

在這個示例中碗短,首先創(chuàng)建了一個空列表受葛,用于存儲接下來將創(chuàng)建的所有外星人。range()返回一系列數(shù)字偎谁,其用途是告訴Python我們要重復(fù)這個循環(huán)多少次总滩。每次執(zhí)行這個循環(huán)時,都創(chuàng)建一個外星人巡雨,并將其附加到列表aliens末尾闰渔。然后使用一個切片來打印前五個外星人,然后打印列表的長度铐望,以證明確實創(chuàng)建了30個外星人

{'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看來,每個外星人都是獨立的正蛙,這讓我們能夠獨立地修改每個外星人督弓。
在什么情況下需要處理成群結(jié)隊的外星人呢?想象一下乒验,可能隨著游戲的進(jìn)行愚隧,有些外星人會變色且移動速度會加快。必要時锻全,我們可以使用for循環(huán)和if語句來修改某些外星人的顏色狂塘。
例如,要將前三個外星人修改為黃色的鳄厌、速度為中等且值10個點燥爷,可以這樣做:

# 創(chuàng)建一個用于存儲外星人的空列表 
aliens = []
# 創(chuàng)建30個綠色的外星人
for alien_number in range (0,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['speed'] = 'medium' 
        alien['points'] = 10

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

由于我們要修改前三個外星人礁遣,需要遍歷一個只包含這些外星人的切片瓷炮。當(dāng)前咧七,所有外星人都是綠色的,但情況并非總是如此新思,因此我們編寫了一條if語句來確保只修改綠色外星人窖梁。如果外星人是綠色的,我們就將其顏色改為yellow夹囚,將其速度改為medium纵刘,并將其點數(shù)改為10, 如下面的輸出所示:

{'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'}

你可以進(jìn)一步擴(kuò)展這個循環(huán)荸哟,在其中添加一個elif代碼塊假哎,將黃色外星人改為移動速度快且值15個點的紅色外星人瞬捕,如下所示(這里只列出了循環(huán),而沒有列出整個程序):

for alien in aliens[0:3]:
    if alien['color'] == 'green':
        alien['color'] = 'yellow'
        alien['speed'] = 'medium'
        alien['points'] = 10
    elif alien['color'] == 'yellow': 
        alien['color'] = 'red' 
        alien['speed'] = 'fast' 
        alien['points'] = 15

在字典中存儲列表

有時候舵抹,需要將列表存儲在字典中肪虎,而不是將字典存儲在列表中。例如惧蛹,你如何描述顧客點的比薩呢?如果使用列表扇救,只能存儲要添加的比薩配料,但如果使用字典香嗓,就不僅可在其中包含配料列表迅腔,還可包含其他有關(guān)比薩的描述。
在下面的示例中靠娱,存儲了比薩的兩方面信息沧烈,外皮類型和配料列表。其中的配料列表是一個與鍵toppings相關(guān)聯(lián)的值像云。要訪問該列表锌雀,我們使用字典名和鍵toppings,就像訪問字典中的其他值一樣迅诬。這將返回一個配料列表腋逆,而不是單個值:

# 存儲所點比薩的信息 
pizza = {
'crust': 'thick',
'toppings': ['mushrooms', 'extra cheese']}
# 概述所點的比薩
print("You ordered a " + pizza['crust'] + "-crust pizza " +
"with the following toppings:")
for topping in pizza['toppings']: 
    print("\t" + topping)

我們首先創(chuàng)建了一個字典,其中存儲了有關(guān)顧客所點比薩的信息百框。在這個字典中闲礼,一個鍵是crust牍汹,與之相關(guān)聯(lián)的值是字符串thick铐维,下一個鍵是toppings,與之相關(guān)聯(lián)的值是一個列表慎菲,其中存儲了顧客要求添加的所有配料嫁蛇。制作前我們概述了顧客所點的比薩。為打印配料露该,我們編寫了一個for循環(huán)睬棚。為訪問配料列表,我們使用了鍵toppings解幼,這樣Python將從字典中提取配料列表抑党。
下面的輸出概述了要制作的比薩:

You ordered a thick-crust pizza with the following  toppings: 
    mushrooms
    extra cheese

每當(dāng)需要在字典中將一個鍵關(guān)聯(lián)到多個值時,都可以在字典中嵌套一個列表撵摆。在前面有關(guān)喜歡的編程語言的示例中底靠,如果將每個人的回答都存儲在一個列表中,被調(diào)查者就可選擇多種喜歡的語言特铝。在這種情況下暑中,當(dāng)我們遍歷字典時壹瘟,與每個被調(diào)查者相關(guān)聯(lián)的都是一個語言列表,而不是一種語言鳄逾,因此稻轨,在遍歷該字典的for循環(huán)中,我們需要再使用一個for循環(huán)來遍歷與被調(diào)查者相關(guān)聯(lián)的語言列表:

favorite_languages = {'jen': ['python', 'ruby'],
                    'sarah': ['c'],
                    'edward': ['ruby', 'go'], 
                    'phil': ['python', 'haskell'], }

for name, languages in favorite_languages.items():
    print("\n" + name.title() + "'s favorite languages are:")
    for language in languages: 
        print("\t" + language.title())

現(xiàn)在與每個名字相關(guān)聯(lián)的值都是一個列表雕凹。請注意殴俱,有些人喜歡的語言只有一種,而有些人有多種枚抵。遍歷字典時粱挡,我們使用了變量languages來依次存儲字典中的每個值,因為我們知道這些值都是列表俄精。在遍歷字典的主循環(huán)中询筏,我們又使用了一個for循環(huán)來遍歷每個人喜歡的語言列表。現(xiàn)在竖慧,每個人想列出多少種喜歡的語言都可以:

Jen's favorite languages are:
    Python
    Ruby
Sarah's favorite languages are:
    C
Phil's favorite languages are:
    Python
    Haskell
Edward's favorite languages are:
    Ruby
    Go

在字典中存儲字典

可在字典中嵌套字典嫌套,但這樣做時,代碼可能很快復(fù)雜起來圾旨。例如踱讨,如果有多個網(wǎng)站用戶,每個都有獨特的用戶名砍的,可在字典中將用戶名作為鍵痹筛,然后將每位用戶的信息存儲在一個字典中,并將該字典作為與用戶名相關(guān)聯(lián)的值廓鞠。
在下面的程序中帚稠,對于每位用戶,我們都存儲了其三項信息:名床佳、姓和居住地滋早,為訪問這些信息,我們遍歷所有的用戶名砌们,并訪問與每個用戶名相關(guān)聯(lián)的信息字典:

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())

我們首先定義了一個名為users的字典杆麸,其中包含兩個鍵:用戶名aeinsteinmcurie,與每個鍵相關(guān)聯(lián)的值都是一個字典浪感,其中包含用戶的名昔头、姓和居住地。我們先遍歷字典users影兽,讓Python依次將每個鍵存儲在變量username中揭斧,并依次將與當(dāng)前鍵相關(guān)聯(lián)的字典存儲在變量user_info中。
在主循環(huán)內(nèi)部赢笨,我們將用戶名打印出來未蝌。接著我們開始訪問內(nèi)部的字典驮吱。變量user_info包含用戶信息字典,而該字典包含三個鍵:first萧吠、lastlocation左冬,對于每位用戶,我們都使用這些鍵來生成整潔的姓名和居住地纸型,然后打印有關(guān)用戶的簡要信息:

Username: aeinstein
Full name: Albert Einstein Location: Princeton
Username: mcurie
Full name: Marie Curie Location: Paris

小作業(yè)
11-1 請想出5個人的名字拇砰,并將這些名字用作字典中的鍵,想出每個人喜歡的一個數(shù)字狰腌,并將這些數(shù)字作為值存儲在字典中除破。打印每個人的名字和喜歡的數(shù)字。
11-2 創(chuàng)建一個字典琼腔,在其中存儲三條大河流及其流經(jīng)的國家瑰枫。其中一個鍵—值對可能是'nile':'egypt'。使用循環(huán)為每條河流打印一條消息丹莲,如"The Nile runs through Egypt."光坝。使用循環(huán)將該字典中每條河流的名字都打印出來。使用循環(huán)將該字典包含的每個國家的名字都打印出來甥材。
11-3 創(chuàng)建多個字典盯另,對于每個字典,都使用一個寵物的名稱來給它命名;在每個字典中洲赵,包含寵物的類型及其主人的名字鸳惯。將這些字典存儲在一個名為pets的列表中,再遍歷該列表叠萍,并將寵物的所有信息都打印出來芝发。

想查看作業(yè)答案可以去我的Githu倉庫在文件夾(11-1——11-3)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市俭令,隨后出現(xiàn)的幾起案子后德,更是在濱河造成了極大的恐慌,老刑警劉巖抄腔,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異理张,居然都是意外死亡赫蛇,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門雾叭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來悟耘,“玉大人,你說我怎么就攤上這事织狐≡萦祝” “怎么了筏勒?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長旺嬉。 經(jīng)常有香客問我管行,道長,這世上最難降的妖魔是什么邪媳? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任捐顷,我火速辦了婚禮,結(jié)果婚禮上雨效,老公的妹妹穿的比我還像新娘迅涮。我一直安慰自己,他們只是感情好徽龟,可當(dāng)我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布叮姑。 她就那樣靜靜地躺著,像睡著了一般据悔。 火紅的嫁衣襯著肌膚如雪戏溺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天屠尊,我揣著相機(jī)與錄音旷祸,去河邊找鬼。 笑死讼昆,一個胖子當(dāng)著我的面吹牛托享,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播浸赫,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼闰围,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了既峡?” 一聲冷哼從身側(cè)響起羡榴,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎运敢,沒想到半個月后校仑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡传惠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年迄沫,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片卦方。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡羊瘩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情尘吗,我是刑警寧澤逝她,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站睬捶,受9級特大地震影響黔宛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜侧戴,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一宁昭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧酗宋,春花似錦积仗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至回右,卻和暖如春隆圆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背翔烁。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工渺氧, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蹬屹。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓侣背,卻偏偏與公主長得像,于是被迫代替她去往敵國和親慨默。 傳聞我的和親對象是個殘疾皇子贩耐,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 感覺自己的pc快被自己折騰壞了,換了內(nèi)存以后重啟就藍(lán)屏厦取,今天搞完事情要完整地看一下怎么處理潮太。 第6章 字典 在本章...
    Charles_DT閱讀 327評論 3 2
  • 字典 學(xué)習(xí)如何訪問和修改字典中的信息 學(xué)習(xí)如何遍歷字典中的數(shù)據(jù) 學(xué)習(xí)儲存字典的列表,存儲列表中的字典和存儲字典中的...
    August________閱讀 327評論 0 4
  • 一虾攻、基礎(chǔ) 1.說明:用放在花括號{}中的一系列鍵值對表示铡买,每個鍵都與一個值相關(guān)聯(lián),可以使用鍵來訪問值台谢。與鍵相關(guān)聯(lián)的...
    菁華浮英夢閱讀 267評論 0 0
  • 字典相當(dāng)于java中的Map集合(以鍵值對的形式存放數(shù)據(jù)) 窖翱瘛:一般是字符串居多。值:數(shù)字朋沮、字符串、列表、字典本身...
    永不熄滅的火焰_e306閱讀 158評論 0 0
  • 久違的晴天樊拓,家長會纠亚。 家長大會開好到教室時,離放學(xué)已經(jīng)沒多少時間了筋夏。班主任說已經(jīng)安排了三個家長分享經(jīng)驗蒂胞。 放學(xué)鈴聲...
    飄雪兒5閱讀 7,492評論 16 22