アプリ版:「スタンプのみでお礼する」機能のリリースについて

以下のようなデータがあって、b[a['key1']]のようにアクセスしたいのですが、
どうしたらアクセスできるでしょうか。教えてください。

a = {'key1': '[hoge][hoge2][key1]', 'key2': '[hoge][hoge2][key2]'}
b = {
'hoge':{
'hoge2':{
'key1':100,
'key2':200
}
}
}
print (b[a['key1']])

質問者からの補足コメント

  • ご回答ありがとうございます。なるほど、結構面倒なんですね。

    いまやろうとしてることは、為替レートが取れる複数のサイトからurllibで
    JSON形式で為替データを取ってきてUSDJPYの値を抜き出したいと思っています。

    例えば以下2つのサイトです。
    # yahoo
    https://query.yahooapis.com/v1/public/yql?q=sele …

    [続く]

    No.1の回答に寄せられた補足コメントです。 補足日時:2016/08/12 00:13
  • [続き]
    # fixer
    http://api.fixer.io/latest?symbols=USD,JPY

    この場合、yahooの場合は、['query']['results']['rate']['Rate']になりますし、
    fixerは['rates']['JPY']で取り出せます。調査対象のサイトが10個程度あったので、
    それぞれアクセス出来るキーワードを予め用意しておけばいいと考えました。

    普通こういったケースではどのように処理するのでしょうか。

      補足日時:2016/08/12 00:13

A 回答 (2件)

その場合だと


a: 抜き出したいデータへ辿り着くため、予め用意したキーワード
b; JSON形式から得たデータ
ということですよね?

だとすると
○ '[hoge][hoge2][key1]', 等と一つの文字列で持たせようとすると、分割する必要がでてきます。
予め決まっているのだから ('hoge','hoge2','key1') と、タプル(または[]でリスト)で持っていれば、分割する必要が無くなります。

○ b の深さが変化するのなら、
b[k[0]][k[1]][k[2]]
等とまとめてやろうとはせずに
b0 = b[k[0]]
b1 = b0[k[1]]
b2 = b1[k[2]]
...
などと、キーの数で辿る数を変えればできます。
ループや再帰を使えば、どんな個数でも対応できます。
    • good
    • 0
この回答へのお礼

勉強になりました。ありがとうございました!

お礼日時:2016/08/12 00:40

今の状態では



a['key1'] で 文字列 '[hoge][hoge2][key1]' を得る

正規表現等の文字列操作を使って 'hoge','hoge2','key1' の3つの文字列を得る
例) k=('hoge','hoge2','key1') の状態にする

得られ文字列を使って b['hoge']['hoge2']['key1']を得る
上記例だと b[k[0]][k[1]][k[2]]

※ 毎回書くのが面倒なので、適当な関数にする

くらいではないでしょうか。

データ構造自体の見直しも考えた方がよいでしょう。



evalという方法もありますが、危険なのでお勧めしません。
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!