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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Python 3.x

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

4920閲覧

Python Django 辞書型リスト 取り出し方

stwebyy

総合スコア14

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Python 3.x

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

1クリップ

投稿2019/02/07 15:54

前提・実現したいこと

Djangoを使用し、GoogleBooksAPIから取ってきたjsonをhtmlに出力しようと考えています。
まずは返ってきているjsonからtitleを表示させようとしていましたが、うまくいきません。

該当のソースコード

python

1# 一部省略しています 2 def get(request): 3 url = "https://www.googleapis.com/books/v1/volumes?q=" 4 isbn = "isbn:" 5 if "isbn" in request.GET: 6 param_value = request.GET.get("isbn") 7 u = url + isbn + param_value 8 req = urllib.request.urlopen(u) 9 isbn_json = json.load(req) 10 test = isbn_json['items']['volumeInfo']['title'] 11 print(test) 12 context = { 13 'param_value' : param_value, 14 'isbn_json' : isbn_json 15 } 16 return render(request, 'hogehoge.html', context) 17

json

1{ 2 'kind': 'books#volumes', 3 'totalItems': 1, 4 'items': [{ 5 'kind': 'books#volume', 6 'id': 'iGn6ugEACAAJ', 7 'etag': 'hU4sLVOJKS0', 8 'selfLink': 'https://www.googleapis.com/books/v1/volumes/iGn6ugEACAAJ', 9 'volumeInfo': { 10 'title': 'Docker/Kubernetes実践コンテナ開発入門', 11 'authors': ['山田明憲'], 12 'publishedDate': '2018-09-08', 13 'description': 'コンテナ開発、運用がゼロからわかる。本番で使えるコンテナアプリケーションをつくる。Docker/Kubernetesの基礎から、コンテナを中心とした実践開発スタイルまで。', 14 'industryIdentifiers': [{ 15 'type': 'ISBN_10', 16 'identifier': '4297100339' 17 }, { 18 'type': 'ISBN_13', 19 'identifier': '9784297100339' 20 }], 21 'readingModes': { 22 'text': False, 23 'image': False 24 }, 25 'pageCount': 411, 26 'printType': 'BOOK', 27 'maturityRating': 'NOT_MATURE', 28 'allowAnonLogging': False, 29 'contentVersion': 'preview-1.0.0', 30 'panelizationSummary': { 31 'containsEpubBubbles': False, 32 'containsImageBubbles': False 33 }, 34 'imageLinks': { 35 'smallThumbnail': 'http://books.google.com/books/content?id=iGn6ugEACAAJ&printsec=frontcover&img=1&zoom=5&source=gbs_api', 36 'thumbnail': 'http://books.google.com/books/content?id=iGn6ugEACAAJ&printsec=frontcover&img=1&zoom=1&source=gbs_api' 37 }, 38 'language': 'ja', 39 'previewLink': 'http://books.google.co.jp/books?id=iGn6ugEACAAJ&dq=isbn:4297100339&hl=&cd=1&source=gbs_api', 40 'infoLink': 'http://books.google.co.jp/books?id=iGn6ugEACAAJ&dq=isbn:4297100339&hl=&source=gbs_api', 41 'canonicalVolumeLink': 'https://books.google.com/books/about/Docker_Kubernetes%E5%AE%9F%E8%B7%B5%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E9%96%8B.html?hl=&id=iGn6ugEACAAJ' 42 }, 43 'saleInfo': { 44 'country': 'JP', 45 'saleability': 'NOT_FOR_SALE', 46 'isEbook': False 47 }, 48 'accessInfo': { 49 'country': 'JP', 50 'viewability': 'NO_PAGES', 51 'embeddable': False, 52 'publicDomain': False, 53 'textToSpeechPermission': 'ALLOWED', 54 'epub': { 55 'isAvailable': False 56 }, 57 'pdf': { 58 'isAvailable': False 59 }, 60 'webReaderLink': 'http://play.google.com/books/reader?id=iGn6ugEACAAJ&hl=&printsec=frontcover&source=gbs_api', 61 'accessViewStatus': 'NONE', 62 'quoteSharingAllowed': False 63 }, 64 'searchInfo': { 65 'textSnippet': 'コンテナ開発、運用がゼロからわかる。本番で使えるコンテナアプリケーションをつくる。Docker/Kubernetesの基礎から、コンテナを中心とした実践開発スタイルまで。' 66 } 67 }] 68}

試したこと

上記コードの以下の部分を変更してみるとitemsは表示されました。

python

1test = isbn_json['items']

json

1// itemsの中身 2[{ 3 'kind': 'books#volume', 4 'id': 'iGn6ugEACAAJ', 5 'etag': 'hU4sLVOJKS0', 6 'selfLink': 'https://www.googleapis.com/books/v1/volumes/iGn6ugEACAAJ', 7 'volumeInfo': { 8 'title': 'Docker/Kubernetes実践コンテナ開発入門', 9 'authors': ['山田明憲'], 10 'publishedDate': '2018-09-08', 11 'description': 'コンテナ開発、運用がゼロからわかる。本番で使えるコンテナアプリケーションをつくる。Docker/Kubernetesの基礎から、コンテナを中心とした実践開発スタイルまで。', 12 'industryIdentifiers': [{ 13 'type': 'ISBN_10', 14 'identifier': '4297100339' 15 }, { 16 'type': 'ISBN_13', 17 'identifier': '9784297100339' 18 }], 19 'readingModes': { 20 'text': False, 21 'image': False 22 }, 23 'pageCount': 411, 24 'printType': 'BOOK', 25 'maturityRating': 'NOT_MATURE', 26 'allowAnonLogging': False, 27 'contentVersion': 'preview-1.0.0', 28 'panelizationSummary': { 29 'containsEpubBubbles': False, 30 'containsImageBubbles': False 31 }, 32 'imageLinks': { 33 'smallThumbnail': 'http://books.google.com/books/content?id=iGn6ugEACAAJ&printsec=frontcover&img=1&zoom=5&source=gbs_api', 34 'thumbnail': 'http://books.google.com/books/content?id=iGn6ugEACAAJ&printsec=frontcover&img=1&zoom=1&source=gbs_api' 35 }, 36 'language': 'ja', 37 'previewLink': 'http://books.google.co.jp/books?id=iGn6ugEACAAJ&dq=isbn:4297100339&hl=&cd=1&source=gbs_api', 38 'infoLink': 'http://books.google.co.jp/books?id=iGn6ugEACAAJ&dq=isbn:4297100339&hl=&source=gbs_api', 39 'canonicalVolumeLink': 'https://books.google.com/books/about/Docker_Kubernetes%E5%AE%9F%E8%B7%B5%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E9%96%8B.html?hl=&id=iGn6ugEACAAJ' 40 }, 41 'saleInfo': { 42 'country': 'JP', 43 'saleability': 'NOT_FOR_SALE', 44 'isEbook': False 45 }, 46 'accessInfo': { 47 'country': 'JP', 48 'viewability': 'NO_PAGES', 49 'embeddable': False, 50 'publicDomain': False, 51 'textToSpeechPermission': 'ALLOWED', 52 'epub': { 53 'isAvailable': False 54 }, 55 'pdf': { 56 'isAvailable': False 57 }, 58 'webReaderLink': 'http://play.google.com/books/reader?id=iGn6ugEACAAJ&hl=&printsec=frontcover&source=gbs_api', 59 'accessViewStatus': 'NONE', 60 'quoteSharingAllowed': False 61 }, 62 'searchInfo': { 63 'textSnippet': 'コンテナ開発、運用がゼロからわかる。本番で使えるコンテナアプリケーションをつくる。Docker/Kubernetesの基礎から、コンテナを中心とした実践開発スタイルまで。' 64 } 65}]

しかし、 titleだけがほしいのでいろいろ試しましたがダメでした。

python

1test = isbn_json['items'][4]['title']
エラー文 list index out of range

となりました。

辞書型リスト?

いろいろ調べてみたのですがどうもよくわからず・・・。
参考サイト1
参考サイト2

調べながら試しているのですが一向にわかる気配がありません・・・。
引き続き調べていますが、どなたかわかる方いらっしゃいますか?

補足情報(FW/ツールのバージョンなど)

Python3.6.4
Django2.0.2

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

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

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

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

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

wwbQzhMkhhgEmhU

2019/02/07 19:27

多分ここを読んでいるほとんどの方が分かると思います。 まずはリスト型に慣れましょう。 値の入れ方と参照する方法。 次に辞書型に慣れましょう。 これも値の入れ方と参照する方法をよく理解しましょう。 両方出来たら入れ子になっているケースを考えれば分かるはずです。 こういうのは他人に聞いても仕方なくて、自分で理解するしかないと思います。
stwebyy

2019/02/09 02:07

そうですね、一つ一つ細分化して理解していきたいと思います。 返信していただきありがとうございます。
guest

回答2

0

ベストアンサー

調べながら試している

おそらく大きな問題点は2つあるだろうと思います。

  • (A.1) JSONのデータ構造(より一般的にPythonの任意のデータ構造)がどんな具合になっているか曖昧
  • (A.2) ひょっとしたら式[指標]でどの部分が取り出されるのかが曖昧
  • (B) 上記を複雑な構造に対して段階を踏まずにいきなり把握しようとしている

特にJSONのような複雑な構造になりがちなデータについてどうデバッグ(あるいは把握)したらよいかをアドバイスしてみようと思います。

test = isbn_json['items']['volumeInfo']['title']

この行をいくら眺めても元々の知識不足(あるいは勘違い)のため間違いになかなか気づけないでいるのが今の状況だと思います。アプローチを変えてみましょう。こういう場合一段階ずつ以下を確認するのが簡単・確実です。

  • どんな型なのか

dict, int, float, listなど様々な型が入れ子になっているのがJSONです。それを一段階ずつ構造をほぐしつつそれぞれの階層の値がどんな型なのかを確認しましょう。

  • その型についてより詳しい情報

例えばdictならどんなキーがあるか、listなら何要素あるのかを知るのが有効です。

デバッグ例:

python

1# test = isbn_json['items']['volumeInfo']['title']` 2# エラーメッセージを見て間違いかすぐにわからなかったとする。 3 4# 段階1 5print(type(isbn_json)) # => <class 'dict'> 6 # dictであることがわかった 7print([*isbn_json.keys()]) # => ['kind', 'totalItems', 'items'] 8 # このdictインスタンスに3つのキーがあることが確認できる 9print('items' in isbn_json) # => True 10 # 'items'キーがあるはずと知っているなら直接調べてもよい 11 12# 段階2 13items = isbn_json['items'] # 一段階だけ奥のデータを取り出す 14print(type(items)) # => <class 'list'> 15 # listであることがわかった 16print(len(items)) # => 1 17 # このlistインスタンスには要素が一つしかない 18 # 当然ながら指定できる指標は0のみ 19 20# 段階3 21item0 = items[0] 22...

上の例では
test = isbn_json['items']['valumeInfo']...と書くのは間違いで少なくとも
test = isbn_json['items'][0]...と書かねばならないことがすぐにわかります。

前述の(A)が曖昧な場合あちこちのサイトを眺めて一度に全部把握しようとする((B)のアプローチ)ことで四苦八苦するより、上の例のように一段階ずつデータをほぐしていって内容を確認する方がずっと単純・明快に間違いを見つけられるでしょう。

ちなみに・・・「一段階ずつ」というのは本件以外のことにも当てはまります。複雑な行でエラーが起きたとき「どこでエラーがおきたかわからない」ということはままあります。そんな場合その行を細かく切り刻んでどの段階でエラーがおきるか確認するのです。

本件の例でいえば
b = a[i][j][k]

python

1temp1 = a[i] 2temp2 = temp1[j] 3b = temp2[k]

と同等であることはおわかりですよね?このようにばらばらにして確認していけばよいという話です。

投稿2019/02/08 03:38

KSwordOfHaste

総合スコア18392

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

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

stwebyy

2019/02/09 02:11

こんなご丁寧にありがとうございます。 そうですね、仰る通り細分化して一つ一つ理解していかないといけないですね。 参考になりました!ありがとうございます! 引き続き勉強していきたいと思います。
guest

0

一つ一つデバッグを行い、たどり着きました。

test = isbn_json['items'] print(type(test)) print(len(test)) test2 = test[0] print(type(test2)) print(test2.keys()) test3 = test2['volumeInfo'] print(type(test3)) print(test3.keys()) test4 = test3['title'] print(type(test4)) print(test4) title = isbn_json['items'][0]['volumeInfo']['title'] print(title)

細分化していくことが非常に大切だと改めて感じました。
ご教授いただきありがとうございました!

投稿2019/02/09 02:42

stwebyy

総合スコア14

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問