字典的創(chuàng)建及使用

1 創(chuàng)建字典

字典以類似于下面的方式表示:
phonebook = {'Alice': '2341', 'Beth': '9102', 'Cecil': '3258'}
字典由鍵及其相應(yīng)的值組成虽惭,這種鍵?值對稱為項(item)。在前面的示例中顾画,鍵為名字,而值為電話號碼勇凭。每個鍵與其值之間都用冒號(:)分隔义辕,項之間用逗號分隔灌砖,而整個字典放在花括號內(nèi)≌合牛空字典(沒有任何項)用兩個花括號表示撩幽,類似于下面這樣: {}。

1.1 dict函數(shù)

可使用函數(shù)dict從其他映射(如其他字典)或鍵-值對序列創(chuàng)建字典宪萄。

>>> items = [('name', 'Gumby'), ('age', 42)]
>>> d = dict(items)
>>> d
{'age': 42, 'name': 'Gumby'}
>>> d['name']
'Gumby'

還可使用關(guān)鍵字實參來調(diào)用這個函數(shù)榨惰,如下所示:

>>> d = dict(name='Gumby', age=42)
>>> d
{'age': 42, 'name': 'Gumby'}

盡管這可能是函數(shù)dict最常見的用法琅催,但也可使用一個映射實參來調(diào)用它,這將創(chuàng)建一個字典侠碧,其中包含指定映射中的所有項缠黍。像函數(shù)list、 tuple和str一樣挨队,如果調(diào)用這個函數(shù)時沒有提供任何實參蒿往,將返回一個空字典盛垦。從映射創(chuàng)建字典時,如果該映射也是字典(畢竟字典是Python中唯一的內(nèi)置映射類型)瓤漏,可不使用函數(shù)dict腾夯,而是使用字典方法copy颊埃,這將在本章后面介紹。

1.2 字典的基本操作

字典的基本行為在很多方面都類似于序列蝶俱。

  • len(d)返回字典d包含的項(鍵?值對)數(shù)班利。
  • d[k]返回與鍵k相關(guān)聯(lián)的值。
  • d[k] = v將值v關(guān)聯(lián)到鍵k榨呆。
  • del d[k]刪除鍵為k的項。
  • k in d檢查字典d是否包含鍵為k的項积蜻。
    雖然字典和列表有多個相同之處闯割,但也有一些重要的不同之處。
  • 鍵的類型:字典中的鍵可以是整數(shù)竿拆,但并非必須是整數(shù)宙拉。字典中的鍵可以是任何不可變的類型,如浮點數(shù)(實數(shù))丙笋、字符串或元組谢澈。
  • 自動添加:即便是字典中原本沒有的鍵,也可以給它賦值御板,這將在字典中創(chuàng)建一個新項锥忿。然而,如果不使用append或其他類似的方法稳吮,就不能給列表中沒有的元素賦值。
  • 成員資格:表達式k in d(其中d是一個字典)查找的是鍵而不是值井濒,而表達式v in l(其中l(wèi)是一個列表)查找的是值而不是索引灶似。這看似不太一致,但你習慣后就會覺得相當自然瑞你。畢竟如果字典包含指定的鍵酪惭,檢查相應(yīng)的值就很容易。
    示例:
henry@ubuntu:~/python$ cat database.py 
#!/usr/bin/env python3
# 一個簡單的數(shù)據(jù)庫
# 一個將人名用作鍵的字典者甲。每個人都用一個字典表示春感,
# 字典包含鍵'phone'和'addr',它們分別與電話號碼和地址相關(guān)聯(lián)
people = {
'Alice': {
'phone': '2341',
'addr': 'Foo drive 23'
},
'Beth': {
'phone': '9102',
'addr': 'Bar street 42'
},
'Cecil': {
'phone': '3158',
'addr': 'Baz avenue 90'
}
}
# 電話號碼和地址的描述性標簽虏缸,供打印輸出時使用
labels = {
'phone': 'phone number',
'addr': 'address'
}
name = input('Name: ')
# 要查找電話號碼還是地址鲫懒?
request = input('Phone number (p) or address (a)? ')
# 使用正確的鍵:
if request == 'p': key = 'phone'
if request == 'a': key = 'addr'
# 僅當名字是字典包含的鍵時才打印信息:
if name in people: print("{}'s {} is {}.".format(name, labels[key], people[name][key]))
henry@ubuntu:~/python$ ./database.py 
Name: Alice
Phone number (p) or address (a)? p
Alice's phone number is 2341.
henry@ubuntu:~/python$ ./database.py 
Name: Alice
Phone number (p) or address (a)? a
Alice's address is Foo drive 23.

1.3 通過字典鍵名為格式化字符串提供變量

當格式化字符串"{name}".format_map(字典)中的name在字典中存在對應(yīng)的鍵名時,可以直接使用format_map(字典)來對格式化字符串進行填充刽辙。

>>> phonebook
{'Beth': '9102', 'Alice': '2341', 'Cecil': '3258'}
>>> "Cecil's phone number is {Cecil}.".format_map(phonebook)
"Cecil's phone number is 3258.

2 常見字典操作函數(shù)

2.1 clear

方法clear刪除所有的字典項窥岩,這種操作是就地執(zhí)行的(就像list.sort一樣),因此什么都不返回(或者說返回None)宰缤。

>>> d = {}
>>> d['name'] = 'Gumby'
>>> d['age'] = 42
>>> d
{'age': 42, 'name': 'Gumby'}
>>> returned_value = d.clear()
>>> d
{}
>>> print(returned_value)
None

這為何很有用呢颂翼?我們來看兩個場景晃洒。下面是第一個場景:

>>> x = {}
>>> y = x
>>> x['key'] = 'value'
>>> y
{'key': 'value'}
>>> x = {}
>>> y
{'key': 'value'}

下面是第二個場景:

>>> x = {}
>>> y = x
>>> x['key'] = 'value'
>>> y
{'key': 'value'}
>>> x.clear()
>>> y
{}

在這兩個場景中, x和y最初都指向同一個字典朦乏。在第一個場景中球及,我通過將一個空字典賦給x來“清空”它。這對y沒有任何影響呻疹,它依然指向原來的字典吃引。這種行為可能正是你想要的,但要刪除原來字典的所有元素诲宇,必須使用clear际歼。如果這樣做, y也將是空的姑蓝,如第二個場景所示鹅心。

2.2 copy及deepcopy

方法copy返回一個新字典,其包含的鍵-值對與原來的字典相同(這個方法執(zhí)行的是淺復制纺荧,因為值本身是原件旭愧,而非副本)。

>>> x = {'username': 'admin', 'machines': ['foo', 'bar', 'baz']}
>>> y = x.copy()
>>> y['username'] = 'mlh'    #原值不變
>>> y['machines'].remove('bar')  #原值一起變化
>>> y
{'username': 'mlh', 'machines': ['foo', 'baz']}
>>> x
{'username': 'admin', 'machines': ['foo', 'baz']}
>>> y['machines'][0]='aaa'   #原值一起變化
>>> x
{'username': 'henry', 'machines': ['aaa', 'baz']}
>>> y
{'username': 'mlh', 'machines': ['aaa', 'baz']}

為避免上述問題可以使用copy模塊中的deepcopy函數(shù)來執(zhí)行深復制宙暇,即同時復制值及其包含的所有值输枯。

>>> from copy import deepcopy
>>> d = {}
>>> d['names'] = ['Alfred', 'Bertrand']
>>> c = d.copy()
>>> dc = deepcopy(d)
>>> d['names'].append('Clive')
>>> c
{'names': ['Alfred', 'Bertrand', 'Clive']}
>>> dc
{'names': ['Alfred', 'Bertrand']}

2.3 fromkeys

方法fromkeys創(chuàng)建一個新字典,其中包含指定的鍵占贫,且每個鍵對應(yīng)的值都是None桃熄。

>>> {}.fromkeys(['name', 'age'])
{'age': None, 'name': None}

這個示例首先創(chuàng)建了一個空字典,再對其調(diào)用方法fromkeys來創(chuàng)建另一個字典型奥,這顯得有點多余瞳收。你可以不這樣做,而是直接對dict(前面說過厢汹, dict是所有字典所屬的類型)調(diào)用方法fromkeys螟深。

>>> dict.fromkeys(['name', 'age'])
{'age': None, 'name': None}

如果你不想使用默認值None,可提供特定的值烫葬。

>>> dict.fromkeys(['name', 'age'], '(unknown)')
{'age': '(unknown)', 'name': '(unknown)'}

2.4 get

通常界弧,如果你試圖訪問字典中沒有的項,將引發(fā)錯誤搭综。而使用get在訪問字典中不存在的項時默認返回None垢箕,并且不會引發(fā)上述錯誤。

>>> d = {}
>>> print(d['name'])
Traceback (most recent call last):
File "<stdin>", line 1, in ?
KeyError: 'name'

而使用get不會這樣:

>>> print(d.get('name'))
None

如你所見兑巾,使用get來訪問不存在的鍵時舰讹,沒有引發(fā)異常,而是返回None闪朱。你可指定“默認值”月匣,這樣將返回你指定的值而不是None钻洒。

>>> d.get('name', 'N/A')
'N/A'

如果字典包含指定的鍵, get的作用將與普通字典查找相同锄开。

>>> d['name'] = 'Eric'
>>> d.get('name')
'Eric'

2.5 items

方法items返回一個包含所有字典項的列表素标,其中每個元素都為(key, value)的形式。字典項在列表中的排列順序不確定萍悴。

>>> d = {'title': 'Python Web Site', 'url': 'http://www.python.org', 'spam': 0}
>>> d.items()
dict_items([('url', 'http://www.python.org'), ('spam', 0), ('title', 'Python Web Site')])

返回值屬于一種名為字典視圖的特殊類型头遭,字典視圖可用于迭代;另外癣诱,你還可確定其長度以及對其執(zhí)行成員資格檢查计维。

>>> it = d.items()
>>> len(it)
3
>>> ('spam', 0) in it
True

視圖的一個優(yōu)點是不復制,它們始終是底層字典的反映撕予。當?shù)讓幼值涞膬?nèi)容被修改時鲫惶,視圖呈現(xiàn)出來的是修改后的值。

>>> d['spam'] = 1
>>> ('spam', 0) in it
False
>>> d['spam'] = 0
>>> ('spam', 0) in it
True

然而实抡,如果你要將字典項復制到列表中(在較舊的Python版本中欠母,方法items就是這樣做的),可自己動手做吆寨。

>>> list(d.items())
[('spam', 0), ('title', 'Python Web Site'), ('url', 'http://www.python.org')]

2.6 keys

方法keys返回一個字典視圖赏淌,其中包含指定字典中的鍵。

>>> d.keys()
dict_keys(['title', 'url', 'spam'])

2.7 pop

方法pop可用于獲取與指定鍵相關(guān)聯(lián)的值啄清,并將該鍵-值對從字典中刪除六水。

>>> d = {'x': 1, 'y': 2}
>>> d.pop('x')
1
>>> d
{'y': 2}

2.8 popitem

方法popitem類似于list.pop,但list.pop彈出列表中的最后一個元素辣卒,而popitem隨機地彈出一個字典項掷贾,因為字典項的順序是不確定的,沒有“最后一個元素”的概念添寺。如果你要以高效地方式逐個刪除并處理所有字典項胯盯,這可能很有用懈费,因為這樣無需先獲取鍵列表计露。

>>> d = {'url': 'http://www.python.org', 'spam': 0, 'title': 'Python Web Site'}
>>> d.popitem()
('url', 'http://www.python.org')
>>> d
{'spam': 0, 'title': 'Python Web Site'}

2.9 setDefalult

當指定的鍵不存在時, setdefault使用參數(shù)中提供的值來更新字典憎乙,并返回對應(yīng)的鍵值票罐;當指定的鍵存在時,直接返回其值泞边,并保持字典不變该押。

>>> d = {}
>>> d.setdefault('name', 'N/A')
'N/A'
>>> d
{'name': 'N/A'}
>>> d['name'] = 'Gumby'
>>> d.setdefault('name', 'N/A')
'Gumby'
>>> d
{'name': 'Gumby'}

與get一樣,值是可選的阵谚;如果沒有指定蚕礼,默認為None烟具。

>>> d = {}
>>> print(d.setdefault('name'))
None
>>> d
{'name': None}

2.10 update

方法update使用一個字典中的項來更新另一個字典。

>>> d = {
... 'title': 'Python Web Site',
... 'url': 'http://www.python.org',
... 'changed': 'Mar 14 22:09:15 MET 2016'
... } 
>>> x = {'title': 'Python Language Website'}
>>> d.update(x)
>>> d
{'url': 'http://www.python.org', 'changed':
'Mar 14 22:09:15 MET 2016', 'title': 'Python Language Website'}

對于通過參數(shù)提供的字典奠蹬,將其項添加到當前字典中朝聋。如果當前字典包含鍵相同的項,就替換它囤躁〖胶郏可像調(diào)用本章前面討論的函數(shù)dict(類型構(gòu)造函數(shù))那樣調(diào)用方法update。這意味著調(diào)用update時狸演,可向它提供一個映射言蛇、一個由鍵?值對組成的序列(或其他可迭代對象)或關(guān)鍵字參數(shù)。

2.11 values

方法values返回一個由字典中的值組成的字典視圖宵距。不同于方法keys腊尚,方法values返回的視
圖可能包含重復的值。

>>> d = {}
>>> d[1] = 1
>>> d[2] = 2
>>> d[3] = 3
>>> d[4] = 1
>>> d.values()
dict_values([1, 2, 3, 1])
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末消玄,一起剝皮案震驚了整個濱河市跟伏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌翩瓜,老刑警劉巖受扳,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異兔跌,居然都是意外死亡勘高,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門坟桅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來华望,“玉大人,你說我怎么就攤上這事仅乓±抵郏” “怎么了?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵夸楣,是天一觀的道長宾抓。 經(jīng)常有香客問我,道長豫喧,這世上最難降的妖魔是什么石洗? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮紧显,結(jié)果婚禮上讲衫,老公的妹妹穿的比我還像新娘。我一直安慰自己孵班,他們只是感情好涉兽,可當我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布招驴。 她就那樣靜靜地躺著,像睡著了一般枷畏。 火紅的嫁衣襯著肌膚如雪忽匈。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天矿辽,我揣著相機與錄音丹允,去河邊找鬼。 笑死袋倔,一個胖子當著我的面吹牛雕蔽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播宾娜,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼批狐,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了前塔?” 一聲冷哼從身側(cè)響起嚣艇,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎华弓,沒想到半個月后食零,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡寂屏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年贰谣,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片迁霎。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡吱抚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出考廉,到底是詐尸還是另有隱情秘豹,我是刑警寧澤,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布昌粤,位于F島的核電站既绕,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏婚苹。R本人自食惡果不足惜岸更,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一鸵膏、第九天 我趴在偏房一處隱蔽的房頂上張望膊升。 院中可真熱鬧,春花似錦谭企、人聲如沸廓译。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽非区。三九已至瓜挽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間征绸,已是汗流浹背久橙。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留管怠,地道東北人淆衷。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像渤弛,于是被迫代替她去往敵國和親祝拯。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,728評論 2 351

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理她肯,服務(wù)發(fā)現(xiàn)佳头,斷路器,智...
    卡卡羅2017閱讀 134,638評論 18 139
  • 字典:當索引不好用時 字典是一種通過名字引用值的數(shù)據(jù)結(jié)構(gòu)晴氨。這種結(jié)構(gòu)類型稱為映射康嘉。字典是Python中唯一內(nèi)建的映射...
    mydre閱讀 500評論 0 0
  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時...
    歐辰_OSR閱讀 29,343評論 8 265
  • 那西方的太陽 撒下一抹泛黃的絲帶 昔日鵝黃的絲帶已變的泛黃 往日的林蔭已長成了商場大廈 不知哪里來的云靄 那泛黃的...
    比阿布閱讀 263評論 2 6
  • 我是小熊,workface的全職召集人籽前。 也許也是因為馬上要給2017畫上一個句號凄鼻,給2018做一個新的開啟。在冬...
    a64b2bf15b3c閱讀 302評論 0 1