pythonで文字列を使わずにネストされた辞書の値を取得してみる

こんにちは。Aliceです。
タイトル、意味がわからない人も居ると思いますので、例を表示します。


>>> d = {"form":{"action":"sample.php","method":"get"}}
のような辞書のネストを、

>>> d["form"]["action"]
"sample.php"
のように、辞書のキー、値の文字列が分かっている場合は上記の文で出力できますが、もしキーや値がわからない場合、ネストされている辞書の値を無理やり取得する方法を書いてみようと思います。


さて、まず方針を示してみようと思います。上記のように、ネストされた値を取得するには


d["form"]["action"]
辞書の名前[最初のキー][ネストされた辞書の最初のキー]
のように、二つのキーを取得する必要があります。


辞書のキーを取得する

辞書のキーを取得するには、

>>> d.keys()[0]
["form"]
と書きます。


ネストされた辞書のキーを取得するには、上記の文を工夫すれば良いのですがすこし複雑になります。


(ここから、はてな記法により]を二つ同時並べてしまうとエラーが出るので、[]の間に空白をいれています。Pythonインタプリタで動かすときは、この空白は必要ありませんが、空白を入れても一応実行出来ます。)
まず、


>>> d[ d.keys()[0] ]
{'action': 'sample.php', 'method': 'GET'}
と書いて、ネストされた辞書を取得します。
ここでは、分かりやすく説明するため、この値を変数に代入します。

>>> nest = d[ d.keys()[0] ]
このあとは、上記のやり方と同じように、

>>> nest.keys()[0]
'action'
こうすればキーが取得できるので、

>>> nest[ nest.keys()[0] ]
'sample.php'
とすれば、ネストされた辞書の値が取得できます。


さて、ここからが面白いところです。変数nestを分解して、ネストされた辞書の値を取得してみましょう。


まず、変数nestは、ネストされた辞書そのものを格納していました。


>>> d[ d.keys()[0] ]
{'action': 'sample.php', 'method': 'GET'}
これですね。
では、これを使って、まずはネストされた辞書の最初のキーを取得してみましょう。

>>> d[ d.keys()[0] ].keys()[0]
'action'
はい、取得できました。だんだんややこしくなってきましたね…


では次、上記で取得したキーと、最初の辞書のキーを使って、ネストされた辞書の値を取得します。
結果から書くと、


>>> d[ d.keys()[0] ][ d[ d.keys()[0] ].keys()[0] ]
'sample.php'
はい、これで取得できました。
頭の上に?が3つ付いてる方は、以下の説明をみてみてください。

d["form"]["action"]
d[ d.keys()[0] ][ d[ d.keys()[0] ].keys()[0] ]
この色の部分と、この色の部分が対照になっています。


ちなみに、
ネストされている辞書の2個目の値を取得する場合は、


>>> d[ d.keys()[0] ][ d[d.keys()[0]].keys()[1] ]
'GET'
これでOKです。


これを応用すると、


>>> form = "<"+str(d.keys()[0])+" "+str(d[d.keys()[0]].keys()[0])+"='"+str(d[ d.keys()[0] ][ d[d.keys()[0]].keys()[0] ])+"' "+str(d[d.keys()[0]].keys()[1])+"='"+str(d[ d.keys()[0] ][ d[d.keys()[0]].keys()[1] ])+"'>"
>>> form
"<form action='sample.php' method='GET'>"
と、HTMLタグがかけたりします。


まとめると、


>>> d
{'form': {'action': 'sample.php', 'method': 'GET'}}
>>> d.keys()[0]
'form'
>>> d[ d.keys()[0] ]
{'action': 'sample.php', 'method': 'GET'}
>>> d[ d.keys()[0] ].keys()[0]
'action'
>>> d[ d.keys()[0] ].keys()[1]
'method'
>>> d[ d.keys()[0] ][ d[d.keys()[0]].keys()[0] ]
'sample.php'
>>> d[ d.keys()[0] ][ d[d.keys()[0]].keys()[1] ]
'GET'



以上で、今回の記事を閉めようと思います。
それでは、aliceでした!




追伸

まだ、love-python.tkの使い道がわかりません…