[PY3]——內建資料結構(7)——字典及其常用操作

Jelly_lyj發表於2017-03-18

字典及其常用操作Xmind圖

 

 

關於字典

字典是一種key-value結構

字典是無序的

 

字典的定義

# {}大括號可以直接定義一個空字典
In [1]: d={};type(d)
Out[1]: dict

# {key:value}
In [2]: d={'a':1,'b':2};print(d)
{'a': 1, 'b': 2}

# dict([(key,value)]) 可迭代物件的元素必須是一個二元組,二元組的第0個元素為key,第1個元素的為value
In [6]: d=dict( [ ('a',1),('b',2) ] );print(d)
{'a': 1, 'b': 2}

# dict.fromkeys(可迭代物件,value) 傳入的可迭代物件作為key,value預設時預設為None
In [8]: d=dict.fromkeys(range(5));print(d)
{0: None, 1: None, 2: None, 3: None, 4: None}

In [9]: d=dict.fromkeys(range(5),'aa');print(d)
{0: 'aa', 1: 'aa', 2: 'aa', 3: 'aa', 4: 'aa'}

 

字典的增加與修改操作

In [10]: d
Out[10]: {0: 'aa', 1: 'aa', 2: 'aa', 3: 'aa', 4: 'aa'}

# 可以直接使用key作為下標來操作,下標存在時為修改、不存在時為增加
In [11]: d['5']='bb';print(d)
{0: 'aa', 1: 'aa', 2: 'aa', 3: 'aa', 4: 'aa', '5': 'bb'}

# update() 當中的可以是一個字典,所以通常用於合併兩個字典
In [15]: d.update([('6','cc')]);print(d)
{0: 'aa', 1: 'aa', 2: 'aa', 3: 'aa', 4: 'aa', '5': 'bb', '6': 'cc'}

In [17]: d.update({'7':'ee'});print(d)
{0: 'aa', 1: 'aa', 2: 'aa', 3: 'aa', 4: 'aa', 'e': 'e', '5': 'bb', '6': 'cc', '7': 'ee'}

 

字典的刪除操作

1. pop(key,返回值)

In [21]: d
Out[21]: {0: 'aa', 1: 'bb', 2: 'aa', 3: 'aa', 4: 'aa'}

# pop(key)從字典刪除一個key,返回該key對應的value
In [22]: d.pop(4)
Out[22]: 'aa'
In [23]: d
Out[23]: {0: 'aa', 1: 'bb', 2: 'aa', 3: 'aa'}

# 刪除不存在的key,丟擲KeyError
In [24]: d.pop(4)
KeyError: 4

# 刪除不存在的key並指定預設值時,不會丟擲KeyError並返回預設值
In [25]: d.pop(4,'default');print(d)
{0: 'aa', 1: 'bb', 2: 'aa', 3: 'aa'}

2. popitem() 隨機刪除一對,對空字典popitem()丟擲KeyError

In [26]: d
Out[26]: {0: 'aa', 1: 'bb', 2: 'aa', 3: 'aa'}

In [27]: d.popitem()
Out[27]: (0, 'aa')

In [28]: d.popitem()
Out[28]: (1, 'bb')

3. clear() 清空一個字典

4. del語句(通常不會使用del來刪除)

In [29]: d
Out[29]: {2: 'aa', 3: 'aa'}

In [30]: del d[3];print(d)
{2: 'aa'}

 

字典的訪問

In [1]: d={'d':2,'p':0,'r':2}

# 可通過key來訪問其對應的value
In [2]: d['d']
Out[2]: 2

In [3]: d['a']
KeyError: 'a'

# get(key,返回值) 返回值不指定時預設為None
In [4]: d.get('d')
Out[4]: 2

In [5]: d.get('a')

In [6]: d.get('a','default')
Out[6]: 'default'

 

字典的遍歷

# for迴圈直接遍歷dict,可遍歷到字典的key
In [8]: for i in d:
...: print(i)
p
d
r

# dict.keys()返回一個可迭代物件,元素是字典的所有key
In [17]: d.keys()
Out[17]: dict_keys(['p', 'd', 'r'])

In [18]: for i in d.keys():
...: print(i)
p
d
r

# dict.values()返回一個可迭代物件,元素是字典的所有value
In [12]: d.values()
Out[12]: dict_values([0, 2, 2])

In [13]: for i in d.values():
...: print(i)
0
2
2

# dict.items()返回一個可迭代物件,元素是字典的(key,value)
In [14]: d.items()
Out[14]: dict_items([('p', 0), ('d', 2), ('r', 2)])

In [15]: for i in d.items():
...: print(i)
('p', 0)
('d', 2)
('r', 2)

# 可以利用遍歷items來做解構
In [16]: for k,v in d.items():
...: print(k,v)
p 0
d 2
r 2

# PY3與PY2的不同在於:
PY3中keys、values、items返回的是類似生成器的可迭代物件,並不會複製一份記憶體;
PY2中keys、values、items返回的是一個列表,會複製一份記憶體。(當然啦可用iterkeys、itervalues、iteritems替代)

 

字典的限制

字典的key不能重複,且需要可Hash

 

預設字典

# default初始化的時候,需要傳入一個函式,這個函式也叫工廠函式。
# 當我們使用下標訪問一個key時,如果這個key不存在,defaultdict會自動呼叫初始化時傳入的函式,生成一個物件作為這個key的value

In [20]: from collections import defaultdict

In [21]: d1={}
In [25]: d1[0]
KeyError: 0

In [23]: d2=defaultdict(list)
In [26]: d2[0]
Out[26]: []

In [24]: d3=defaultdict(tuple)
In [27]: d3[0]
Out[27]: ()

 

有序字典

In [30]: from collections import OrderedDict

In [31]: d=OrderedDict()

In [33]: d[0]=3;d[3]=1;d[6]=1

In [34]: d
Out[34]: OrderedDict([(0, 3), (3, 1), (6, 1)])

In [35]: for k,v in d.items():
...: print(k,v)
0 3
3 1
6 1

 

相關文章