2008年9月12日金曜日

Python でハッシュに相当するもの - マップ型の「辞書」に対する操作

1. マップ型を実装した辞書

Python において、ハッシュに相当するものはマップ型と呼ばれる。

2.3.8 マップ型 によると、

現在のところは標準のマップ型、dictionary だけです。

インターフェスがマップ型で、その実装が辞書。 ただし、Python ではインターフェイスと言わずに、プロトコルと呼ぶ。

2.3.8 マップ型に定義されているメソッドを適当に分類しておく。

最初にマップ型のオブジェクトを作成する。

# 辞書: key は変更不能でなければならない。

persons = {"Tarou"   : 20,
            "Hanako" : 15,
            "Jiro"   : 30}

 

2. 基本的な操作

# 要素の値をキーで取得
print persons['Hanako']

# 要素の追加
persons['Saburou'] = 40
print persons

# 要素を削除
del persons['Hanako']
print persons

# 要素の走査
for k,v in persons.iteritems():
    print k, v

# 大きさ
print len(persons)

 

3. キーに対する操作

# キーの一覧を取得
print persons.keys()

# キーの存否を確認する
print persons.has_key('Jiro')
print persons.has_key('Tarosuke')

print 'Jiro' in persons
print 'Tarousuke' in persons
print 'Tarousuke' not in persons

 

4. 値を取得

# 値の一覧を取得
print persons.values()

 

5. イテレータ系

# iteritems() に加えて...
print [person for person in persons.iterkeys()]
print [person for person in persons.itervalues()]

 

6. 基本操作の拡張

# --- 要素の取得

# 要素がない場合、KeyError が投げられる
#print persons['Hana']

# キーがないとき、None が返される
print persons.get('Hana')
# キーがないときに返される値を指定
print persons.get('Hana', u"Hana さんはいません")
# 以下と同じ
if not persons.get('Hana'):
    print u"Hana さんはいません"
else:
    print person['Hana']

# --- なければ登録

# get との違いは、キーがない場合、辞書に登録
persons.setdefault('Hana', 10)
print persons

# --- pop : 取り出して削除

print persons.pop('Jiro')
print persons
persons['Jiro'] = 30

# 任意のペアを取り出す
print persons.popitem()

# --- 要素の更新・追加

# 更新
persons.update({'Hana':100})
print persons
# 追加
persons.update({'Funa' :200, 'Hoge': 300})
print persons

# type({}) ->  だからこれを利用して
print dict.fromkeys([10,20,30,40], "hoge")
print dict.fromkeys('abcd', "piyo")

 

7. その他

# タプルのリストから辞書を生成する - リスト内包表記を使って
nums = [1,2,3,4,5]
print dict([(x, x+10) for x in nums])

# タプルのリスト cf. keys(), values()
print persons.items()

# 浅いコピー
p2 = persons.copy()
print p2

# 要素を全て削除
persons.clear()
print persons

dict()  は、関数電卓 (Python 版) の使い方が参考になる。

135:   # 演算子の名前をキーにしてハッシュ表を作る
136:   H_OP=dict([(str(op), op)  for op in L_OP])

 

関連記事