首頁  >  文章  >  後端開發  >  Python的dict字典結構操作方法

Python的dict字典結構操作方法

高洛峰
高洛峰原創
2017-03-02 17:15:121549瀏覽

這篇文章主要介紹了Python的dict字典結構操作方法學習筆記本,字典的操作是Python入門學習中的基礎知識,需要的朋友可以參考下

一.字典的基本方法

1.新字典

1)、建立一個空的字典

>>> dict1={} 
>>> dict2=dict() 
>>> dict1,dict2 
({}, {})

2)、新建的時候初始化一個值

>>> dict1={1:'a',2:'b',3:'c'} 
>>> dict1 
{1: 'a', 2: 'b', 3: 'c'}

#3)、利用元組


>>> dict1=dict([(1,'a'),(2,'b'),(3,'c')]) 
>>> dict1 
{1: 'a', 2: 'b', 3: 'c'}

2、取得方法

1)、get(key)  從字典取得一個key對應的value,返回value


>>> dict1={1:'a',2:'b',3:'c'} 
>>> dict1.get(1) 
'a'

#如果字典裡面不存在,則傳回一個NoneType

##

>>> type(dict1.get(4)) 
<type &#39;NoneType&#39;>

 如果要求key值不存在,指定另一個值回傳的話

>>> dict1.get(4,&#39;not found&#39;) 
&#39;not found&#39;

 

2)、keys ()   取得字典中所有的key值,回傳一個列表

>>> dict1.keys() 
[1, 2, 3]

3)、values() 與keys()方法對應,傳回的字典中的所有value的清單

>>> dict1.values() 
[&#39;a&#39;, &#39;b&#39;, &#39;c&#39;]

4)、items() 傳回一個(key,value)對應的元組

##
>>> dict1.items() 
[(1, &#39;a&#39;), (2, &#39;b&#39;), (3, &#39;c&#39;)]

5)、iterkeys() , itervalues() , iteritems()  也是分別取得所有的key,value,(key,value)元祖,只是不在是返回列表,而是一個迭代器

>>> for key in dict1.iterkeys(): 
 print key 
1 
2 
3

 

3、設定字典值的方法
1)、直接的方法就是


>>> dict1[4]=&#39;d&#39; 
>>> dict1 
{1: &#39;a&#39;, 2: &#39;b&#39;, 3: &#39;c&#39;, 4: &#39;d&#39;}

但是,這個方法就是,如果我想要新增的key值已經在字典中,那麼就會覆寫原來的value值

>>> dict1[4]=&#39;e&#39; 
>>> dict1 
{1: &#39;a&#39;, 2: &#39;b&#39;, 3: &#39;c&#39;, 4: &#39;e&#39;}

2)、setdefault(key,value)  這個方法的好處是,如果插入的key不存在字典中,那麼插入字典並傳回該value,否則的存在於字典中的話,那麼傳回存在的value,不會覆寫

>>> dict1 
{1: &#39;a&#39;, 2: &#39;b&#39;, 3: &#39;c&#39;, 4: &#39;e&#39;} 
>>> dict1.setdefault(5,&#39;f&#39;) 
&#39;f&#39; 
>>> dict1.setdefault(5,&#39;g&#39;) 
&#39;f&#39; 
>>> dict1 
{1: &#39;a&#39;, 2: &#39;b&#39;, 3: &#39;c&#39;, 4: &#39;e&#39;, 5: &#39;f&#39;}

4、刪除字典

1)pop(key)    刪除指定key的一項,成功返回一個刪除項目的value, 如果不存在,會拋出異常,所以在用這個方法時候,都要用判斷key是否存在,或catch這個例外

>>> def pop_key(d,key): 
 try: 
 d.pop(key) 
 print "sucess" 
 except: 
 print "key is not in dict" 
>>> dict1 
{1: &#39;a&#39;, 2: &#39;b&#39;} 
>>> pop_key(dict1,3) 
key is not in dict


##

>>> def sub_dict2(d,key): 
 if d.has_key(key): 
 d.pop(key) 
 print "sucess" 
 else:print "key is not in dict" 
 
>>> pop_key(dict1,3) 
key is not in dict


##這裡的has_key(key)就是判斷字典裡面是否有該key,當然,也可以用  key in d 來代替

2) popitem()  和pop()類似,只是他是刪除一個(key,value)的元組

利用上面的方法,可以得使用一些進階的用法

A、我們透過2個列表來建立一個字典,第一個列表是所有的key,第二個列表是所有的value

>>> list1=[1,2,3] 
>>> list2=[&#39;a&#39;,&#39;b&#39;,&#39;c&#39;] 
>>> dict1=dict(zip(list1,list2)) 
>>> dict1 
{1: &#39;a&#39;, 2: &#39;b&#39;, 3: &#39;c&#39;}

B、找出某一個字典的子字典

>>> dict1 
{1: 'a', 2: 'b', 3: 'c'} 
>>> dict1=dict([(1,&#39;a&#39;),(2,&#39;b&#39;),(3,&#39;c&#39;)]) 
>>> dict1 
{1: &#39;a&#39;, 2: &#39;b&#39;, 3: &#39;c&#39;} 
>>> subkeys=[1,3] 
>>> def sub_dict(d,subkeys): 
 return dict([(k,d.get(k)) for k in subkeys if k in d]) 
 
>>> print sub_dict(dict1,subkeys) 
{1: 'a', 3: 'c'}

C、反轉字典,也就是key變成新字典的value,value變成新字典的key(注意,如果value值有重複,反轉後的字典只會保留一個

>>> def invert_dict(d): 
 return dict([(k,v) for v,k in d.iteritems()]) 
 
>>> print invert_dict(dict1) 
{&#39;a&#39;: 1, &#39;c&#39;: 3, &#39;b&#39;: 2} 
>>>

#5、其他基本的方法

##1 ) has_key(key)   判斷key是否在字典中

2)copy()回傳一個字典的副本(該複製是一個淺複製)

>>> d2={1:[1],2:[2],3:[3]} 
>>> d3=d2.copy() 
>>> d3[1].append(4) 
>>> d2[1] 
[1, 4]

如果要深複製的話,就要用到copy.deepcopy(a)

#

>>> d2={1:[1],2:[2],3:[3]} 
>>> import copy 
>>> d3=copy.deepcopy(d2) 
>>> d3[1].append(4) 
>>> print d2[1] , d3[1] 
[1] [1, 4]

3)clear( ) 清空dict

#4)update(d) 用一個字典來跟新另外一個字典,有點類似與2個字典的合併

>>> dict1={1: &#39;a&#39;, 2: &#39;b&#39;, 3: &#39;c&#39;} 
>>> dict2={1:&#39;x&#39;,4:&#39;y&#39;} 
>>> dict1.update(dict2) 
>>> dict1 
{1: &#39;x&#39;, 2: &#39;b&#39;, 3: &#39;c&#39;, 4: &#39;y&#39;} 
>>>

二、遍歷

字典的遍歷方法很多

1、直接利用dict

>>> d 
{&#39;a&#39;: &#39;aa&#39;, &#39;c&#39;: &#39;cc&#39;, &#39;b&#39;: &#39;bb&#39;} 
>>> for i in d: 
 print i,d[i] 
 
a aa 
c cc 
b bb

2、利用items()

>>> for i,v in d.items(): 
 print i,v 
 
a aa 
c cc 
b bb

#當然也可以這樣


>>> for (i,v) in d.items(): 
 print i,v 
 
a aa 
c cc 
b bb

我印像中有個文章就是比較這2個方法(有括號和沒括號)的效率,說字典大小在200以下時候,有括號速度快一點, 200以上時候,無括號速度快一點,具體我也沒測試。

3、iteritems()

 (我覺得比較好的方法)


>>> for k,v in d.iteritems(): 
 print k,v 
 
a aa 
c cc 
b bb

其他還有些遍歷方法,但是我感覺就這3個就足夠了

#########三、一些進階用法############1、一鍵多值# ########一般情況,字典都是一對一映射的,但如果我們需要一對多的映射,例如一本書,我們要統計一些單字出現的頁數。那麼,可以用list作為dict的value值。在利用setdefault()方法就可以完成##################
>>> d={&#39;hello&#39;:[1,4,9],"good":[1,3,6]} 
>>> d 
{&#39;good&#39;: [1, 3, 6], &#39;hello&#39;: [1, 4, 9]} 
>>> d.setdefault(&#39;good&#39;,[]).append(7) 
>>> d 
{&#39;good&#39;: [1, 3, 6, 7], &#39;hello&#39;: [1, 4, 9]} 
>>> d.setdefault(&#39;bad&#39;,[]).append(2) 
>>> d 
{&#39;bad&#39;: [2], &#39;good&#39;: [1, 3, 6, 7], &#39;hello&#39;: [1, 4, 9]} 
>>>
######

当然,如果写成一个函数话,就可以更方便的使用,
我们也可以利用set来代替list


>>> def addFunc(d,word,pag): 
 d.setdefault(word,set()).add(pag) 
>>> d={&#39;hello&#39;:set([1,4,9]),"good":set([1,3,6])} 
>>> addFunc(d,&#39;hello&#39;,8) 
>>> d 
{&#39;good&#39;: set([1, 3, 6]), &#39;hello&#39;: set([8, 1, 4, 9])} 
>>> addFunc(d,&#39;bad&#39;,8) 
>>> d 
{&#39;bad&#39;: set([8]), &#39;good&#39;: set([1, 3, 6]), &#39;hello&#39;: set([8, 1, 4, 9])}

2、利用字典完成简单工厂模式
字典的value不单单只是一些常见的字符串,数值,还可以是类和方法,比如我们就可以这样来实现简单工厂模式

>>> class cat(object): 
 def __init__(self): 
 print &#39;cat init&#39; 
>>> class dog(object): 
 def __init__(self): 
 print &#39;dag init&#39; 
>>> d={&#39;cat&#39;:cat,&#39;dog&#39;:dog} 
>>> def factoryFunc(d,name): 
 if name in d: 
 return d[name]() 
 else: 
 raise Exception("error") 
>>> cat=factoryFunc(d,&#39;cat&#39;) 
cat init

另外一个例子,利用变量来控制执行的函数

>>> def deal_cat(): 
 print &#39;cat run!!&#39; 
 
>>> def deal_dog(): 
 print &#39;dag run!!&#39; 
 
>>> d={&#39;cat&#39;:deal_cat ,&#39;dog&#39;:deal_dog } 
>>> animal=&#39;cat&#39; 
>>> d[animal]() 
cat run!!


更多Python的dict字典结构操作方法相关文章请关注PHP中文网!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn