Python 內(nèi)置收據(jù)結(jié)構(gòu)之九(字典)


一怠苔、字典 dict

  • key-value 鍵值對(duì)的數(shù)據(jù)的集合
  • 可變的柑司、無序的锅劝、key 不重復(fù)(key 可哈希)

二、字典 dict 定義 初始化

  • d = dict() 或者 d = {}
  • dict(**kwargs) 使用 name = value 初始化一個(gè)字典
  • dict(iterable,**kwarg) 使用可迭代對(duì)象和 name = value 構(gòu)造字典讼育,不過可迭代對(duì)象的元素必須是一個(gè) 二元 結(jié)構(gòu)
    • d = dict(((1,'a'), (2,'b')))d = dict(([1,'a'], [2,'b']))
  • dict(mapping, **kwarg) 使用一個(gè)字典構(gòu)建另一個(gè)字典
  • d = {'a':10, 'b':20, 'c':None, 'd':[1,2,3]}
  • 類方法 dict.fromkeys(iterable, value=None)
    • d = dict.fromkeys(range(5))
    • d = dict.fromkeys(range(5),0)
d1 = {}
d2 = dict()
d3 = {1:1, '2':2, 'a':3, 'b':True, 'c':[1,2,3]}
d4 = {'a':100, 'a':'2'}   # 被后面的覆蓋
d5 = dict([1,2], ['a',[300]], {'b', 400})   # 最后一組是集合奶段,無序的剥纷,所以無法判斷誰是 key
d6 = dict(a=1, b=2, c=3)
d7 = dict(d6)
d8 = dict.fromkeys(range(10))
l1 = [1]
d8 = dict.fromkeys(range(10), l1)   # 不推薦使用此方式,l1 引用變了蹲缠,dict 的 value 會(huì)跟隨變化
print(d8)
l1.append(2)
print(d8)
示例.png
示例2.png

三线定、字典元素的訪問

3.1 d[key]
  • 返回 key 對(duì)應(yīng)的值 value
  • key 不存在拋出 KeyError 異常
示例.png
3.2 get(key[, default])
  • 返回 key 對(duì)應(yīng)的值 value
  • key 不存在返回缺省值斤讥,若沒有設(shè)置缺省值就返回 None湾趾,不創(chuàng)建 kv 對(duì)
示例.png
3.3 setdefault(key[, default])
  • 返回 key 對(duì)應(yīng)的值 value
  • key 不存在,添加 kv 對(duì)近迁,value 設(shè)置為 default簸州,并返回 default,若 default 沒有設(shè)置拓瞪,缺省為 None
示例.png

四祭埂、字典增加和修改

4.1 d[key] = value
  • key 對(duì)應(yīng)的值修改為 value
  • key 不存在添加新的 kv 對(duì)
4.2 update([other]) -> None
  • 使用另一個(gè)字典的 kv 對(duì)更新本字典
  • key 不存在兵钮,就添加
  • key 存在,覆蓋已經(jīng)存在的 key 對(duì)應(yīng)的值
  • 就地修改
d.update(red=1)
d.update((('red',2),))
d.update({'red':3})
示例.png

五泰演、字典刪除

5.1 pop(key[, default])
  • key 存在睦焕,移除它靴拱,并返回它的 value
  • key 不存在,返回給定的 default
  • default 為設(shè)置本谜,key 不存在則拋出 KeyError 異常
示例.png
5.2 popitem()
  • 移除并返回一個(gè)任意的鍵值對(duì)
  • 字典為 empty乌助,拋出 KeyError 異常
示例.png
5.3 clear()
  • 清空字典
5.4 del 語(yǔ)句
a = True
b = [6]
d = {'a':1, 'b':b, 'c':[1, 3, 5]}
del a   # 引用計(jì)數(shù)減一陌知,True 為常量仆葡,并不能說沒有引用
del d['c']   # 刪除了一個(gè)對(duì)象 [1, 3, 5]?
del b[0]   # 列表清空,但列表本身還在登刺,目前列表引用計(jì)數(shù) 2
c = b   # 列表引用計(jì)數(shù) 3
del c   # 引用計(jì)數(shù) 2
del b   # 引用計(jì)數(shù) 1
b = d['b']
  • del d['c'] 看著像刪除了一個(gè)對(duì)象嗡呼,本質(zhì)上減少了一個(gè)對(duì)象的引用,del 實(shí)際上刪除的是名稱揍很,而不是對(duì)象

六万伤、字典的遍歷和移除

6.1 for ... in dict
  • 遍歷 key
for k in d:
    print(k)
示例.png
for k in d.keys():
    print(k)
示例.png
for v in d.values():
    print(v)
示例.png
  • 遍歷 item简珠,即 kv 對(duì)
for item in d.items():
    print(item)
示例.png
for item in d.items():
    print(item[0], item[1])
示例.png
for k,v in d.items():
    print(k, v)
示例.png
for k,_ in d.items():
    print(k)

for _,v in d.items():
    print(v)
6.2 總結(jié)
  • Python 3 中聋庵,keys芙粱、values春畔、items 方法返回一個(gè)類似生成器的可迭代對(duì)象,不會(huì)把函數(shù)的返回結(jié)果復(fù)制到內(nèi)存中

    • 返回 Dictionary view 對(duì)象振峻,可使用 len()择份、iter()in 操作
    • 字典的 entry 的動(dòng)態(tài)的視圖哈打,字典變化讯壶,視圖將反映出這些變化
    • keys 返回一個(gè)類 set 對(duì)象,也就是可看作一個(gè) set 集合
    • values 都可 hash立轧,那么 items 也可看作是類 set 對(duì)象
  • Python 2 中,上面的方法會(huì)返回一個(gè)新的列表帐萎,占據(jù)新的內(nèi)存空間胜卤,所以 Python 2 建議使用 iterkeysitervalues澈段、itertiems 版本舰攒,返回一個(gè)迭代器摩窃,而不是返回一個(gè) copy

6.3 如何在遍歷的時(shí)候移除元素
  • 錯(cuò)誤的做法
d = dict(a=1, b=2, c='abc')
for k,v in d.items():
    d.pop(k)   # 拋異常

while len(d):   # 相當(dāng)于清空,不如直接 clear()
    print(d.popitem())

while d:
    print(d.popitem())
示例.png
示例.png
示例.png
示例.png
  • 正確的做法
d = dict(a=1, b=2, c='abc')
keys = []
for k,v in d.items():
    if isinstance(v, str):
        keys.append(k)

for k in keys:
    d.pop(k)
print(d)
示例.png

七匪蟀、字典的 key

7.1 key 的要求的 set 的元素要求一致
  • set 的元素可看做 keyset 可看做 dict 簡(jiǎn)化版
  • hashable 可哈希才可作為 key材彪,可使用 hash() 測(cè)試
  • d = {1:0, 2.0:3, "abc":None, ('hello','world','python'):"string", b'abc':'135'}

八段化、defaultdict

8.1 collections.defaultdict([default_factory[, ...]])
  • 第一個(gè)參數(shù)是 default_factory,缺省是 None雄嚣,它提供一個(gè)初始化函數(shù)喘蟆,當(dāng) key 不存在的時(shí)候,會(huì)調(diào)用這個(gè)工廠函數(shù)來生成 key 對(duì)應(yīng)的 value
  • 構(gòu)造一個(gè)字典港谊,values 是列表,為其添加隨機(jī)個(gè)元素
import random

d1 = {}
for k in 'abcdef':
    for v in range(random.randint (1, 5)):
        if k not in d1.keys():
            d1[k] = []
        d1[k].append(v)
print(d1)
示例.png
from collections import defaultdict
import random

d2 = defaultdict(list)
for k in 'dbcdef':
    for v in range(random.randint(1, 5)):
        d2[k].append(v)
print(d2)
示例.png

九捕儒、OrderedDict

9.1 collections.OrderedDict([items])
  • key 并不是按照加入的順序排列龙致,可使用 OrderedDict 記錄順序
from collections import OrderedDict
import random

d = {'banana': 3, 'apple': 4, 'orange': 2}
print(d)

keys = list(d.keys())
random.shuffle(keys)
print(keys)

od = OrderedDict()
for key in keys:
    od[key] = d[key]
print(od)
print(od.keys())
示例.png
  • 有序字典可記錄元素插入的順序目代,打印的時(shí)候也是按照這個(gè)順序輸出打印
  • 3.6 版本的 Python 字典就是記錄 key 插入的順序 (IPython 不一定有效果)
9.2 應(yīng)用場(chǎng)景

假如使用字典記錄了 N 個(gè)產(chǎn)品蕴潦,這些產(chǎn)品使用 ID 由小到大加入到字典中
除了使用字典檢索的遍歷俘闯,有時(shí)候需要取出 ID真朗,但希望是按照輸入順序,因?yàn)檩斎腠樞蚴怯行虻?br> 否則還要重新把遍歷到的值排序

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蝗碎,一起剝皮案震驚了整個(gè)濱河市旗扑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌眠菇,老刑警劉巖袱衷,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件致燥,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡嫌蚤,警方通過查閱死者的電腦和手機(jī)脱吱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來女仰,“玉大人,你說我怎么就攤上這事乔外∫徽郑” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵差购,是天一觀的道長(zhǎng)欲逃。 經(jīng)常有香客問我饼暑,道長(zhǎng),這世上最難降的妖魔是什么弓叛? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任撰筷,我火速辦了婚禮,結(jié)果婚禮上抬闯,老公的妹妹穿的比我還像新娘影钉。我一直安慰自己,他們只是感情好奈虾,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布廉赔。 她就那樣靜靜地躺著蜡塌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪馏艾。 梳的紋絲不亂的頭發(fā)上奴愉,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音铁孵,去河邊找鬼锭硼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蜕劝,可吹牛的內(nèi)容都是我干的檀头。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼岖沛,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼暑始!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起廊镜,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎馆蠕,沒想到半個(gè)月后期升,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體惊奇,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡互躬,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了颂郎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吼渡。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖乓序,靈堂內(nèi)的尸體忽然破棺而出寺酪,到底是詐尸還是另有隱情,我是刑警寧澤替劈,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布寄雀,位于F島的核電站,受9級(jí)特大地震影響陨献,放射性物質(zhì)發(fā)生泄漏盒犹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一眨业、第九天 我趴在偏房一處隱蔽的房頂上張望急膀。 院中可真熱鬧,春花似錦龄捡、人聲如沸卓嫂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)晨雳。三九已至行瑞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間餐禁,已是汗流浹背蘑辑。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留坠宴,地道東北人洋魂。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像喜鼓,于是被迫代替她去往敵國(guó)和親副砍。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

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