Pythonのdict辞書構造操作方法学習ノート

8859 ワード

一.辞書の基本的な方法
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)) 
 


要求キー値が存在しない場合、別の値を指定して返すと

>>> dict1.get(4,'not found') 
'not found' 


 
2)、keys()辞書のすべてのkey値を取得し、リストを返します.

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


3)、values()はkeys()メソッドに対応し、返される辞書のすべてのvalueのリスト

>>> dict1.values() 
['a', 'b', 'c'] 


4)、items()は、対応するメタグループを返します.

>>> dict1.items() 
[(1, 'a'), (2, 'b'), (3, 'c')] 


5)、iterkeys()、itervalues()、iteritems()もそれぞれすべてのkey、value、(key、value)元祖を取得し、リストを返すのではなく反復器である

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

3、辞書の値を設定する方法
1)、直接的な方法は

>>> dict1[4]='d' 
>>> dict1 
{1: 'a', 2: 'b', 3: 'c', 4: 'd'} 


しかし、この方法は、追加したいkey値が辞書にある場合、元のvalue値を上書きすることです.

>>> dict1[4]='e' 
>>> dict1 
{1: 'a', 2: 'b', 3: 'c', 4: 'e'} 


2)、setdefault(key,value)この方法の利点は、挿入したkeyが辞書に存在しない場合、辞書を挿入してそのvalueを返すことであり、そうでなければ辞書に存在する場合、存在するvalueを返し、上書きしないことである.

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


4、辞書を削除する
1)pop(key)指定したkeyの1つを削除し,削除した1つのvalueを返すことに成功したが,存在しなければ異常が投げ出されるので,この方法ではkeyが存在するか,catchという異常があるかを判断する.

>>> def pop_key(d,key): 
 try: 
 d.pop(key) 
 print "sucess" 
 except: 
 print "key is not in dict" 
>>> dict1 
{1: 'a', 2: 'b'} 
>>> 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で、2番目のリストはすべてのvalueです.

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


B、ある辞書のサブ辞書を見つける

>>> dict1 
{1: 'a', 2: 'b', 3: 'c'} 
>>> dict1=dict([(1,'a'),(2,'b'),(3,'c')]) 
>>> dict1 
{1: 'a', 2: 'b', 3: 'c'} 
>>> 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値が重複している場合、反転後の辞書は1つしか残っていないことに注意

>>> def invert_dict(d): 
 return dict([(k,v) for v,k in d.iteritems()]) 
 
>>> print invert_dict(dict1) 
{'a': 1, 'c': 3, 'b': 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)新しい辞書と1つの辞書で、2つの辞書とのマージに似ています.

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


二、遍歴
辞書の遍歴方法が多い
1、直接利用dict

>>> d 
{'a': 'aa', 'c': 'cc', 'b': 'bb'} 
>>> 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、ワンタッチ多値
一般的に、辞書は1対1でマッピングされていますが、1冊の本のような1対以上のマッピングが必要な場合は、いくつかの単語が表示されるページ数を統計します.では、listをdictのvalue値として使用できます.setdefault()メソッドで完了

>>> d={'hello':[1,4,9],"good":[1,3,6]} 
>>> d 
{'good': [1, 3, 6], 'hello': [1, 4, 9]} 
>>> d.setdefault('good',[]).append(7) 
>>> d 
{'good': [1, 3, 6, 7], 'hello': [1, 4, 9]} 
>>> d.setdefault('bad',[]).append(2) 
>>> d 
{'bad': [2], 'good': [1, 3, 6, 7], 'hello': [1, 4, 9]} 
>>> 


もちろん、関数を1つ書けばもっと使いやすくなりますし、リストの代わりにsetを利用することもできます

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


2、辞書を利用して簡単な工場モードの辞書を完成するvalueはただいくつかのよくある文字列だけではなくて、数値、またクラスと方法で、例えば私達はこのように簡単な工場モードを実現することができます

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


別の例では、実行する関数を変数で制御する

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