字典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)換成元組