質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

11430閲覧

Python3で複数階層の辞書型を存在チェックして取得する方法

jnst

総合スコア38

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/06/05 03:26

編集2018/06/05 03:28

以下のような辞書型のオブジェクトがあるとします。
「token が存在すれば token の値を取得、なければ例外を出さずに None(undefined, nil) を取得」したいです。

json

1obj = { 2 "facebook": { 3 "token": "xxx" 4 }, 5 "twitter": { 6 } 7}

JavaScript で書くとこうなります

javascript

1const fb = obj["facebook"] && obj["facebook"]["token"]; // => 'xxx' 2const tw = obj["twitter"] && obj["twitter"]["token"]; // => undefined 3const ig = obj["instgram"] && obj["instagram"]["token"]; // => undefined

Ruby なら Safe Navigation Operator があるのでもっとラクです

ruby

1const fb = obj["facebook"]&.["token"]; # => 'xxx' 2const tw = obj["twitter"]&.["token"]; # => nil 3const ig = obj["instgram"]&.["token"]; # => nil

Python3 ではこのように書くしかないんでしょうか
非常に冗長で読みにくいです

python

1const fb = obj["facebook"]["token"] if "facebook" in obj and "token" in obj["facebook"] else None # => 'xxx' 2const tw = obj["twitter"]["token"] if "twitter" in obj and "token" in obj["twitter"] else None # => None 3const ig = obj["instagram"]["token"] if "instagram" in obj and "token" in obj["instagram"] else None # => None

煩雑なのでもっと簡易な書き方があれば教えてください

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

getをつかうとKeyErrorを出しません。またなかった場合の代替値を指定できます。

facebookやtwitterという第一階層が必ずあるのであれば単に

python

1obj['facebook'].get('token') # ない場合はNone 2obj['facebook'].get('token', 'notoken') # ない場合はnotokenという文字列 3

でいけます。第一階層もあるか不定であれば

python

1obj.get("facebook", {}).get("token")

みたいにするのもいいかもしれません。

投稿2018/06/05 03:32

denzow

総合スコア640

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tachikoma

2018/06/05 04:38 編集

最後のコードで一回目のget失敗時にdictを返さないといけないのが何か惜しいですね。単なるコメントですが。
denzow

2018/06/05 08:49

一応`defaultdict`使えばそこも省略できますが、すこし混乱しそうなので控えました汗 ``` In [6]: from collections import defaultdict In [7]: data = defaultdict(dict) In [8]: data['facebook']['token'] = 'my token' In [9]: data['facebook'].get('token') Out[9]: 'my token' In [10]: data['twitter'].get('token') ```
jnst

2018/06/05 09:09 編集

「なければ RuntimeError にならないように empty で初期化してから使う」というスニペットはスクリプト言語ではよく見るものなので、自分にとっては違和感ありませんでした???? obj.get("facebook", {}).get("token") これからこのコードを活用させてもらいます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問