字典與集合

字典dict

字典是python數(shù)據(jù)結(jié)構(gòu)中最為重要的仲吏。常用的名字有哈希表、關(guān)聯(lián)數(shù)組蝌焚;
主要的特點(diǎn)為:鍵值對(duì)集合裹唆,其中鍵key和值value都是python對(duì)象;
(1)鍵是不可變的對(duì)象只洒,值可以是任意的
(2)字典是一個(gè)無(wú)序的集合许帐,序列由于沒(méi)有key做對(duì)應(yīng),因此以順序/索引來(lái)對(duì)應(yīng)值毕谴,序列有序而字典無(wú)序

字典的創(chuàng)建

可以使用如下幾種方式來(lái)創(chuàng)建字典
(1)使用{}花括號(hào)創(chuàng)建字典

mapping = {}
keylst = ['a', 'b', 'c']
valuelst = [1,2,3]

for key, value in zip(keylst, valuelst):
    mapping[key] = value
mapping
------------------------------------
{'a': 1, 'b': 2, 'c': 3}

(2)使用序列生成字典

keylst = ['a', 'b', 'c']
valuelst = [1,2,3]
dict(zip(keylst, valuelst)) 
-----------------------------------
{'a': 1, 'b': 2, 'c': 3}

zip函數(shù)我們?cè)诤罄m(xù)章節(jié)會(huì)做介紹

(3)使用dict.fromkeys(lst)方法

keylst = ['a', 'b', 'c']
dict.fromkeys(keylst)
dict.fromkeys(keylst, 'today')
-----------------------
{'a': None, 'b': None, 'c': None}
{'a': 'today', 'b': 'today', 'c': 'today'}

字典的增刪改查

(1)增:直接給鍵賦予對(duì)應(yīng)的值即可

mapping = {}
mapping['color'] = 'black'
print(mapping)
------------------------------
{'color': 'black'}

(2)刪

  • 使用語(yǔ)句del dict[key]
  • 使用方法dict.pop(key)
dic = {'a': 'white', 'b': 'black', 'c': 'red'}
print(dic)
dic.pop('a')
print(dic)
del dic['c']
print(dic)
---------------------------------------
{'a': 'white', 'b': 'black', 'c': 'red'}
{'b': 'black', 'c': 'red'}
{'b': 'black'}

(3)改:直接根據(jù)key來(lái)修改其對(duì)應(yīng)的值

dic = {'a': 'white', 'b': 'black', 'c': 'red'}
print(dic)
dic['a'] = 'yellow'
print(dic)
---------------------------
{'a': 'white', 'b': 'black', 'c': 'red'}
{'a': 'yellow', 'b': 'black', 'c': 'red'}

(4)查

  • dic[key]
  • key in dic: 成員判斷成畦,只能使用key去做判斷,不能使用value
dic = {'a': 'white', 'b': 'black', 'c': 'red'}
print(dic['c'])
print('a' in dic)
print('c' in dic.keys())
-------------------------
red
True
True

字典常用方法

(1)dict.keys()
生成一個(gè)視圖涝开,通常使用list(dict.keys())返回字典所有的鍵循帐,以列表的形式展現(xiàn)

dic = {'a': 'white', 'b': 'black', 'c': 'red'}
print(dic.keys(), type(dic.keys()))
print(list(dic.keys()))
----------------------------------
dict_keys(['a', 'b', 'c']) <class 'dict_keys'>
['a', 'b', 'c']

(2)dict.values()
生成一個(gè)視圖,可以使用list進(jìn)行轉(zhuǎn)換舀武,list(dict.values())拄养,返回字典所有的值
(3)dic.items():輸出字典的所有元素,原理同上述兩種方法银舱,注意如下例子非常重要瘪匿,后續(xù)字典與列表的轉(zhuǎn)換通常會(huì)采用類型的結(jié)構(gòu)來(lái)處理跛梗。

dic = {'a': 'white', 'b': 'black', 'c': 'red', 'name': 'Alice', 'age': 22, 'city': 'Shanghai'}
print(list(dic.items()))
------------------------------------------
[('a', 'white'), ('b', 'black'), ('c', 'red'), ('name', 'Alice'), ('age', 22), ('city', 'Shanghai')]

(4)dict1.update(dict2)
合并兩個(gè)字典,更改dict1柿顶,而不會(huì)改變dict2茄袖,如果dict1與dict2中有相同的鍵,那么合并后的鍵對(duì)應(yīng)的值會(huì)被覆蓋掉嘁锯,與此同時(shí)最后的輸出是無(wú)序的

dic1 = {'a': 'white', 'b': 'black', 'c': 'red'}
dic2 = {'name': 'Alice', 'age': 22, 'city': 'Shanghai'}
dic1.update(dic2)
print(dic1)
---------------------------------
{'a': 'white', 'b': 'black', 'c': 'red', 'name': 'Alice', 'age': 22, 'city': 'Shanghai'}

(5)dict.get(key)
直接查看key對(duì)應(yīng)的value值宪祥,如果沒(méi)有相應(yīng)的key則返回None,添加print參數(shù)可以多返回一個(gè)值家乘,dic.get(key, print("nothing"))蝗羊,表示如果沒(méi)有對(duì)應(yīng)的key,則輸出nothing

dic = {'a': 'white', 'b': 'black', 'c': 'red', 'name': 'Alice', 'age': 22, 'city': 'Shanghai'}
print(dic.get('city'))
print(dic.get('addr', print('nothing')))
-------------------------------------
Shanghai
nothing
None

字典的鍵的屬性

從字典的定義中我們知道仁锯,字典是無(wú)序的耀找,且鍵是不可變的對(duì)象,值可以是任意的python對(duì)象业崖。

  • 不可變對(duì)象:標(biāo)量類型野芒,元組,字符串双炕,注意列表不是不可變對(duì)象
    那么有沒(méi)有辦法能快速識(shí)別一個(gè)對(duì)象是否可以作為字典的鍵呢狞悲??
  • hash函數(shù)的使用
hash((1,2,3))
hash('hello')
hash([1,2]):報(bào)錯(cuò)妇斤,因?yàn)榱斜聿豢梢宰鳛樽值涞逆I摇锋,除非先將列表轉(zhuǎn)換成元組
print(hash((1,2,3)))
print(hash('hello'))
-----------------------
2528502973977326415
803241608788734770
hash([1,2,3])
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-186-35e31e935e9e> in <module>
----> 1 hash([1,2,3])

TypeError: unhashable type: 'list'

字典元素的訪問(wèn)與遍歷

for keys in dict:
for key in dict.keys():
for v in dic.values():
for (k, v) in dic.items():
scores = [('語(yǔ)文', 98), ('數(shù)學(xué)', 120), ('英語(yǔ)', 100)]
dic = dict(scores)

for key in dic:
    print(key)

for value in dic.values():
    print(value)
    
for (k, v) in dic.items():
    print(k, v)
------------------------
語(yǔ)文
數(shù)學(xué)
英語(yǔ)
98
120
100
語(yǔ)文 98
數(shù)學(xué) 120
英語(yǔ) 100

集合

集合是一種無(wú)序且元素唯一/不重復(fù)的容器,可以認(rèn)為集合類似于字典站超,但是沒(méi)有鍵

創(chuàng)建集合

創(chuàng)建集合可以使用如下兩種方法:
(1)通過(guò)set函數(shù):set(list)
(2)直接使用花括號(hào):{1,2,3,4,5}

lst = [2, 4, 8, 4, 2, 4, 5]
print(set(lst), type(set(lst)))
set1 = {1, 3, 4, 1, 5}
print(set1)
------------------------
{8, 2, 4, 5} <class 'set'>
{1, 3, 4, 5}

集合的方法

(1)增

a.add(x)

set1 = {1, 2, 3, 4, 5, 9}
set1.add(10)
print(set1) 
>>> {1, 2, 3, 4, 5, 9, 10}

(2)刪

a.clear():刪除整個(gè)集合
a.remove(x):刪除集合中x這個(gè)元素
a.pop():隨機(jī)刪除一個(gè)值
set1 = {1, 2, 3, 4, 5, 9}
set1.clear()
print(set1)  >>> set()
set1 = {1, 2, 3, 4, 5, 9}
set1.remove(5)
print(set1) 
>>> {1, 2, 3, 4, 9}
set1 = {8, 2, 3, 4, 5, 9}
set1.pop()
print(set1)
>>>
{3, 4, 5, 8, 9}

集合的運(yùn)算

假設(shè)有兩個(gè)集合:a = {1,2,3} b = {1, 77,88}

  • a.union(b):a和b中所有不同的元素 a | b
  • a.update(b):將a集合設(shè)置為a和b的并集 a |= b
  • a.intersection(b):兩個(gè)集合的交集 a & b
  • a.difference(b):在a中不在b中的元素 a - b
  • a.issubset(b):如果a包含于b荸恕,則返回True
  • a.issuperset(b):如果a包含b返回True
  • a.isdisjoint(b):a,b沒(méi)有交集返回True

重點(diǎn)注意:

集合中的元素必須是不可變的,這與字典是類似的死相,因此如果想要包含列表型元素融求,必須先轉(zhuǎn)換成元組

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市算撮,隨后出現(xiàn)的幾起案子双肤,更是在濱河造成了極大的恐慌,老刑警劉巖钮惠,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件茅糜,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡素挽,警方通過(guò)查閱死者的電腦和手機(jī)蔑赘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人缩赛,你說(shuō)我怎么就攤上這事耙箍。” “怎么了酥馍?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵辩昆,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我旨袒,道長(zhǎng)汁针,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任砚尽,我火速辦了婚禮施无,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘必孤。我一直安慰自己猾骡,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布敷搪。 她就那樣靜靜地躺著兴想,像睡著了一般。 火紅的嫁衣襯著肌膚如雪赡勘。 梳的紋絲不亂的頭發(fā)上嫂便,一...
    開(kāi)封第一講書(shū)人閱讀 51,562評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音狮含,去河邊找鬼。 笑死曼振,一個(gè)胖子當(dāng)著我的面吹牛几迄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播冰评,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼映胁,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了甲雅?” 一聲冷哼從身側(cè)響起解孙,我...
    開(kāi)封第一講書(shū)人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎抛人,沒(méi)想到半個(gè)月后弛姜,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡妖枚,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年廷臼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡荠商,死狀恐怖寂恬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情莱没,我是刑警寧澤初肉,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站饰躲,受9級(jí)特大地震影響牙咏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜属铁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一眠寿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧焦蘑,春花似錦盯拱、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至拼卵,卻和暖如春奢浑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背腋腮。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工雀彼, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人即寡。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓徊哑,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親聪富。 傳聞我的和親對(duì)象是個(gè)殘疾皇子莺丑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355