ホームページ  >  記事  >  バックエンド開発  >  Pythonのdict辞書構造の操作方法

Pythonのdict辞書構造の操作方法

高洛峰
高洛峰オリジナル
2017-03-02 17:15:121588ブラウズ

この記事では主にPythonの辞書構造の操作方法の学習ノートを紹介します。辞書操作は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) 辞書からキーに対応する値を取得し、その値を返す

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

辞書では、NoneType を返します

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

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

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

2)、keys() すべてのキー値を取得します辞書に登録してリストを返します

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

3)、values()はkeys()メソッドに対応し、辞書内のすべての値のリストを返します

>>> 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;}

ですが、このメソッドはつまり、追加したいキー値がすでに辞書にある場合、元の値が上書きされます

>>> 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) このメソッドの利点は、挿入されたキーが辞書に存在しない場合は、辞書を挿入して値を返します。辞書に存在する場合は、既存の値が返され、上書きされません。

4. 辞書を削除します。

1) Pop(key) 指定されたキーの項目を削除し、削除された値を正常に返します。存在しない場合は例外がスローされるため、このメソッドを使用する場合はキーが存在するかどうかを判断する必要があります。 、または例外

>>> 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;}

または

>>> 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


をキャッチします。ここで has_key (key) は、キーが辞書にあるかどうかを判断するために使用されます。 もちろん、代わりに d の key を使用することもできます。

2) Popitem() は、(key, value) タプルを削除することを除いて、pop() に似ています

上記の方法を使用すると、いくつかの高度な使用法を使用できます

A 2 つのリストを通じて辞書を作成します。最初のリストはすべてのキーで、2 番目のリストはすべての値です

>>> 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

B 特定の辞書のサブ辞書を見つけます

>>> 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;}


C。つまり、キーは新しい辞書の値になり、値は新しい辞書のキーになります (値が重複する場合、反転された辞書には 1 つのみが保持されることに注意してください

>>> 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'}

5他の基本的なメソッド

1) has_key(key) キーが辞書にあるかどうかを判断します

2) copy() 辞書のコピーを返します (コピーは浅いコピーです)

>>> 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} 
>>>

Ifディープコピーを作成したい場合は、copy.deepcopy(a)

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

3) clear() clear dict

4) update(d) は、1 つの辞書を使用して別の辞書を更新する必要があります。 2 つの辞書を結合するのと似ています

>>> 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]

2. 辞書を横断する方法はたくさんあります

1. dict を直接使用します

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;} 
>>>

もちろんこれもできます

>>> 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つの方法を比較した記事があります (括弧付きと括弧なし) 2つの方法の効率については、辞書のサイズが 200 未満の場合は括弧を使用した方が高速で、200 を超える場合は括弧を使用しない方が高速です。具体的にはテストしていません。

3. iteritems()

(もっと良い方法だと思います)

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

他にもトラバースメソッドはありますが、この 3 つで十分だと思います

3 つ、いくつかの進歩

1. ワンクリックの複数値
通常、辞書は 1 対 1 にマッピングされますが、書籍など 1 対多のマッピングが必要な場合は、いくつかの単語が含まれているページ数をカウントする必要があります。現れる 。その後、dict の値として list を使用できます。これは、setdefault() メソッドを使用して行うことができます

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

当然,如果写成一个函数话,就可以更方便的使用,
我们也可以利用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 までご連絡ください。