Pythonの辞書型

beanz (2008年11月12日 01:01) | コメント(0) | トラックバック(0)

Pythonのデータに辞書という型があるが、これは他の言語でいうハッシュや連想配列と思って大丈夫だろう。
言語によって違いはあるが普通に

uniform_number = {
 'Hisanori': 21,
 'Tatsunori': 88,
 'Greisinger': 29,
 'Takuya': 0
 }

などとして

print uniform_number['Hisanori']

とすれば

21

と出力される。

uniform_number['Yoshinobu'] = 24

も当然問題ない。
さらに辞書を連結したい時にはupdateメソッドを使って

uniform_number.update({'Koji': 19, 'Michihiro': 2})

とすればuniform_number自身が拡張される。

Perlに慣れていると参照する時に

uniform_number{'Takuya'}

と、キーをブレースで囲ってしまいそうになるが、Pythonの場合個々の要素にアクセスするときはブラケットを使う。
ループ処理なども

for k in uniform_number:
 print k + " => " + str(uniform_number[k])

こう書けばすべてのキーと値を出力してくれる。
Pythonのforループを辞書に適用するときは上のように書いたときは変数kは辞書のキーを受け取っている。
値を受け取りたいときは

for v in uniform_number.values():

と辞書のvaluesメソッドを呼び出せばいい。
キーと値両方欲しい時は

for k, v in uniform_number.items():

とすればkにはキーがvには値が入る事になる。

ただ気をつけなければいけないのは"Pythonは定義していない変数を参照するとエラーになる"という事だ。
それは辞書のキーについても同じ事が言える。
たとえばキーが存在するかどうかを確認したい時に以下のような条件分岐の式は使えない。

if uniform_number['noexists']:

これは条件が成り立たない(Falseになる)のではなくエラーを吐き出してしまう。
PerlやRubyではエラーにまではしない。このへんPythonは結構厳しい。
ただし通常はどの言語でも上のような式はあまり書かないだろう。
例えばPerlで

if ($uniform_number{'Takuya'}) {...}

とした時、0が返ってきてしまいPerlで0は偽として扱われてしまうからだ。
この場合、どの言語でもハッシュ(辞書)のキーの存在を確認する関数(メソッド)を使用すればいい。

Perlでは

if (exists $uniform_number{'key'}) {...}

Rubyでは

if uniform_number.has_key?('key') do ... end

Pythonでは

if uniform_number.has_key('key'): ...

と、こんな感じだ。
もし、真偽値ではなく値そのものを得たいときはPythonの場合getメソッドが使える。

uniform_number.get('Yoshinobu')

とした時は24が得られ

uniform_number.get('noexists')

とした時は特に何も返ってこないしエラーも起きない(実際はNoneというオブジェクトが得られている)
さらにgetメソッドの引数にデフォルト値を追加する事で"キーが存在すればその値を、存在しなければデフォルト値を"得る事が出来る。

uniform_number.get('noexists', 'default')

こう書けば'default'という値を得る。

Pythonにはsetdefaultというメソッドもある。
これはgetとは逆に"キーが存在すれば何もしない、存在しなければ値をセットする"というメソッドで

uniform_number.setdefault('Tomohiro', 7)

みたいな感じで書く。
通常ハッシュは存在するキーに対して再代入を行うと値を上書きしてしまうがこのメソッドで値を代入している時は決して上書きされる事は無い。

カテゴリ:

トラックバック(0)

トラックバックURL: http://blog.beanz-net.jp/beanz_mtos/mt-tb.cgi/19

コメントする