Python基礎(chǔ):徹底學(xué)會(huì)【字典】
↑↑↑點(diǎn)擊上方藍(lán)字,回復(fù)資料,10個(gè)G的驚喜
可變類(lèi)型與不可變類(lèi)型
序列是以連續(xù)的整數(shù)為索引,與此不同的是,字典以"關(guān)鍵字"為索引,關(guān)鍵字可以是任意不可變類(lèi)型,通常用字符串或數(shù)值。 字典是 Python 唯一的一個(gè) 映射類(lèi)型,字符串、元組、列表屬于序列類(lèi)型。
那么如何快速判斷一個(gè)數(shù)據(jù)類(lèi)型 X 是不是可變類(lèi)型的呢??jī)煞N方法:
麻煩方法:用 id(X)函數(shù),對(duì) X 進(jìn)行某種操作,比較操作前后的id,如果不一樣,則X不可變,如果一樣,則X可變。便捷方法:用 hash(X),只要不報(bào)錯(cuò),證明X可被哈希,即不可變,反過(guò)來(lái)不可被哈希,即可變。
i?=?1
print(id(i))??#?140732167000896
i?=?i?+?2
print(id(i))??#?140732167000960
l?=?[1,?2]
print(id(l))??#?4300825160
l.append('Python')
print(id(l))??#?4300825160
print(hash('Name'))??#?7047218704141848153
print(hash((1,?2,?'Python')))??#?1704535747474881831
print(hash([1,?2,?'Python']))
#?TypeError:?unhashable?type:?'list'
print(hash({1,?2,?3}))
#?TypeError:?unhashable?type:?'set'
數(shù)值、字符和元組 都能被哈希,因此它們是不可變類(lèi)型。 列表、集合、字典不能被哈希,因此它是可變類(lèi)型。
字典的定義
字典 是無(wú)序的 鍵:值(key:value)對(duì)集合,鍵必須是互不相同的(在同一個(gè)字典之內(nèi))。
dict內(nèi)部存放的順序和key放入的順序是沒(méi)有關(guān)系的。dict查找和插入的速度極快,不會(huì)隨著key的增加而增加,但是需要占用大量的內(nèi)存。
字典 定義語(yǔ)法為 {元素1, 元素2, ..., 元素n}
其中每一個(gè)元素是一個(gè)「鍵值對(duì)」-- 鍵:值 ( key:value)關(guān)鍵點(diǎn)是「大括號(hào) {}」,「逗號(hào) ,」和「冒號(hào) :」 大括號(hào) -- 把所有元素綁在一起 逗號(hào) -- 將每個(gè)鍵值對(duì)分開(kāi) 冒號(hào) -- 將鍵和值分開(kāi)
創(chuàng)建和訪問(wèn)字典
brand?=?['李寧',?'耐克',?'阿迪達(dá)斯']
slogan?=?['一切皆有可能',?'Just?do?it',?'Impossible?is?nothing']
print('耐克的口號(hào)是:',?slogan[brand.index('耐克')])??
#?耐克的口號(hào)是:?Just?do?it
dic?=?{'李寧':?'一切皆有可能',?'耐克':?'Just?do?it',?'阿迪達(dá)斯':?'Impossible?is?nothing'}
print('耐克的口號(hào)是:',?dic['耐克'])??
#?耐克的口號(hào)是:?Just?do?it
【例子】通過(guò)字符串或數(shù)值作為key來(lái)創(chuàng)建字典。
dic1?=?{1:?'one',?2:?'two',?3:?'three'}
print(dic1)??#?{1:?'one',?2:?'two',?3:?'three'}
print(dic1[1])??#?one
print(dic1[4])??#?KeyError:?4
dic2?=?{'rice':?35,?'wheat':?101,?'corn':?67}
print(dic2)??#?{'wheat':?101,?'corn':?67,?'rice':?35}
print(dic2['rice'])??#?35
注意:如果我們?nèi)〉逆I在字典中不存在,會(huì)直接報(bào)錯(cuò)KeyError。
【例子】通過(guò)元組作為key來(lái)創(chuàng)建字典,但一般不這樣使用。
dic?=?{(1,?2,?3):?"Tom",?"Age":?12,?3:?[3,?5,?7]}
print(dic)??#?{(1,?2,?3):?'Tom',?'Age':?12,?3:?[3,?5,?7]}
print(type(dic))??#?
通過(guò)構(gòu)造函數(shù)dict來(lái)創(chuàng)建字典。
dict()創(chuàng)建一個(gè)空的字典。
【例子】通過(guò)key直接把數(shù)據(jù)放入字典中,但一個(gè)key只能對(duì)應(yīng)一個(gè)value,多次對(duì)一個(gè)key放入 value,后面的值會(huì)把前面的值沖掉。
dic?=?dict()
dic['a']?=?1
dic['b']?=?2
dic['c']?=?3
print(dic)
#?{'a':?1,?'b':?2,?'c':?3}
dic['a']?=?11
print(dic)
#?{'a':?11,?'b':?2,?'c':?3}
dic['d']?=?4
print(dic)
#?{'a':?11,?'b':?2,?'c':?3,?'d':?4}
dict(mapping)new dictionary initialized from a mapping object's (key, value) pairs
dic1?=?dict([('apple',?4139),?('peach',?4127),?('cherry',?4098)])
print(dic1)??#?{'cherry':?4098,?'apple':?4139,?'peach':?4127}
dic2?=?dict((('apple',?4139),?('peach',?4127),?('cherry',?4098)))
print(dic2)??#?{'peach':?4127,?'cherry':?4098,?'apple':?4139}
dict(**kwargs)-> new dictionary initialized with the name=value pairs in the keyword argument list. ?For example: ?dict(one=1, two=2)
【例子】這種情況下,鍵只能為字符串類(lèi)型,并且創(chuàng)建的時(shí)候字符串不能加引號(hào),加上就會(huì)直接報(bào)語(yǔ)法錯(cuò)誤。
dic?=?dict(name='Tom',?age=10)
print(dic)??#?{'name':?'Tom',?'age':?10}
print(type(dic))??#?
字典的內(nèi)置方法
dict.fromkeys(seq[, value])用于創(chuàng)建一個(gè)新字典,以序列seq中元素做字典的鍵,value為字典所有鍵對(duì)應(yīng)的初始值。
seq?=?('name',?'age',?'sex')
dic1?=?dict.fromkeys(seq)
print(dic1)
#?{'name':?None,?'age':?None,?'sex':?None}
dic2?=?dict.fromkeys(seq,?10)
print(dic2)
#?{'name':?10,?'age':?10,?'sex':?10}
dic3?=?dict.fromkeys(seq,?('小馬',?'8',?'男'))
print(dic3)
#?{'name':?('小馬',?'8',?'男'),?'age':?('小馬',?'8',?'男'),?'sex':?('小馬',?'8',?'男')}
dict.keys()返回一個(gè)可迭代對(duì)象,可以使用list()來(lái)轉(zhuǎn)換為列表,列表為字典中的所有鍵。
dic?=?{'Name':?'lsgogroup',?'Age':?7}
print(dic.keys())??#?dict_keys(['Name',?'Age'])
lst?=?list(dic.keys())??#?轉(zhuǎn)換為列表
print(lst)??#?['Name',?'Age']
dict.values()返回一個(gè)迭代器,可以使用list()來(lái)轉(zhuǎn)換為列表,列表為字典中的所有值。
dic?=?{'Sex':?'female',?'Age':?7,?'Name':?'Zara'}
print(dic.values())
#?dict_values(['female',?7,?'Zara'])
print(list(dic.values()))
#?[7,?'female',?'Zara']
dict.items()以列表返回可遍歷的 (鍵, 值) 元組數(shù)組。
dic?=?{'Name':?'Lsgogroup',?'Age':?7}
print(dic.items())
#?dict_items([('Name',?'Lsgogroup'),?('Age',?7)])
print(tuple(dic.items()))
#?(('Name',?'Lsgogroup'),?('Age',?7))
print(list(dic.items()))
#?[('Name',?'Lsgogroup'),?('Age',?7)]
dict.get(key, default=None)返回指定鍵的值,如果值不在字典中返回默認(rèn)值。
dic?=?{'Name':?'Lsgogroup',?'Age':?27}
print("Age?值為?:?%s"?%?dic.get('Age'))??#?Age?值為?:?27
print("Sex?值為?:?%s"?%?dic.get('Sex',?"NA"))??#?Sex?值為?:?NA
print(dic)??#?{'Name':?'Lsgogroup',?'Age':?27}
dict.setdefault(key, default=None)和get()方法 類(lèi)似, 如果鍵不存在于字典中,將會(huì)添加鍵并將值設(shè)為默認(rèn)值。
dic?=?{'Name':?'Lsgogroup',?'Age':?7}
print("Age?鍵的值為?:?%s"?%?dic.setdefault('Age',?None))??#?Age?鍵的值為?:?7
print("Sex?鍵的值為?:?%s"?%?dic.setdefault('Sex',?None))??#?Sex?鍵的值為?:?None
print(dic)??
#?{'Age':?7,?'Name':?'Lsgogroup',?'Sex':?None}
key in dictin操作符用于判斷鍵是否存在于字典中,如果鍵在字典 dict 里返回true,否則返回false。而not in操作符剛好相反,如果鍵在字典 dict 里返回false,否則返回true。
dic?=?{'Name':?'Lsgogroup',?'Age':?7}
#?in?檢測(cè)鍵?Age?是否存在
if?'Age'?in?dic:
????print("鍵?Age?存在")
else:
????print("鍵?Age?不存在")
#?檢測(cè)鍵?Sex?是否存在
if?'Sex'?in?dic:
????print("鍵?Sex?存在")
else:
????print("鍵?Sex?不存在")
#?not?in?檢測(cè)鍵?Age?是否存在
if?'Age'?not?in?dic:
????print("鍵?Age?不存在")
else:
????print("鍵?Age?存在")
#?鍵?Age?存在
#?鍵?Sex?不存在
#?鍵?Age?存在
dict.pop(key[,default])刪除字典給定鍵key所對(duì)應(yīng)的值,返回值為被刪除的值。key值必須給出。若key不存在,則返回default值。del dict[key]刪除字典給定鍵key所對(duì)應(yīng)的值。
dic1?=?{1:?"a",?2:?[1,?2]}
print(dic1.pop(1),?dic1)??#?a?{2:?[1,?2]}
#?設(shè)置默認(rèn)值,必須添加,否則報(bào)錯(cuò)
print(dic1.pop(3,?"nokey"),?dic1)??#?nokey?{2:?[1,?2]}
del?dic1[2]
print(dic1)??#?{}
dict.popitem()隨機(jī)返回并刪除字典中的一對(duì)鍵和值,如果字典已經(jīng)為空,卻調(diào)用了此方法,就報(bào)出KeyError異常。
dic1?=?{1:?"a",?2:?[1,?2]}
print(dic1.popitem())??#?{2:?[1,?2]}
print(dic1)??#?(1,?'a')
dict.clear()用于刪除字典內(nèi)所有元素。
dic?=?{'Name':?'Zara',?'Age':?7}
print("字典長(zhǎng)度?:?%d"?%?len(dic))??#?字典長(zhǎng)度?:?2
dic.clear()
print("字典刪除后長(zhǎng)度?:?%d"?%?len(dic))??
#?字典刪除后長(zhǎng)度?:?0
dict.copy()返回一個(gè)字典的淺復(fù)制。
dic1?=?{'Name':?'Lsgogroup',?'Age':?7,?'Class':?'First'}
dic2?=?dic1.copy()
print("dic2")??
#?{'Age':?7,?'Name':?'Lsgogroup',?'Class':?'First'}
【例子】直接賦值和 copy 的區(qū)別
dic1?=?{'user':?'lsgogroup',?'num':?[1,?2,?3]}
#?引用對(duì)象
dic2?=?dic1??
#?淺拷貝父對(duì)象(一級(jí)目錄),子對(duì)象(二級(jí)目錄)不拷貝,還是引用
dic3?=?dic1.copy()??
print(id(dic1))??#?148635574728
print(id(dic2))??#?148635574728
print(id(dic3))??#?148635574344
#?修改?data?數(shù)據(jù)
dic1['user']?=?'root'
dic1['num'].remove(1)
#?輸出結(jié)果
print(dic1)??#?{'user':?'root',?'num':?[2,?3]}
print(dic2)??#?{'user':?'root',?'num':?[2,?3]}
print(dic3)??#?{'user':?'runoob',?'num':?[2,?3]}
dict.update(dict2)把字典參數(shù)dict2的key:value對(duì) 更新到字典dict里。
dic?=?{'Name':?'Lsgogroup',?'Age':?7}
dic2?=?{'Sex':?'female',?'Age':?8}
dic.update(dic2)
print(dic)??
#?{'Sex':?'female',?'Age':?8,?'Name':?'Lsgogroup'}

↓掃描二維碼添加好友↓ 推薦閱讀
(點(diǎn)擊標(biāo)題可跳轉(zhuǎn)閱讀)
老鐵,三連支持一下,好嗎?↓↓↓
評(píng)論
圖片
表情
