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

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

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

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

Q&A

解決済

1回答

1015閲覧

Python 2次元配列について

rrrrrrrry

総合スコア20

Python 3.x

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

0グッド

0クリップ

投稿2018/09/07 03:28

編集2018/09/10 07:18

前提・実現したいこと

(前提)gurunaviのapiを使用

出力すると2次元配列になっているのですがprint(line[a][b])というようにしても、全く出力されない点の改善。
また全体図をprint(line)でターミナル上には出力できるが、f.writeで出力することができない。

該当のソースコード

Python

1#!/usr/bin/env python 2# -*- coding: utf-8 -*- 3import sys 4import requests 5import urllib 6import json 7import re #正規表現で特定のワードを検索 8 9menu_name = "とんかつ" 10 11def gnavi_api(): 12 keyid = "" 13 url = "https://api.gnavi.co.jp/PhotoSearchAPI/v3/" 14 #input("メニュー名を入力してください:") 15 encoding = 'utf-8' 16 query = [ 17 ("format", "json"), 18 ("keyid", keyid), 19 ("menu_name", menu_name.encode(encoding)), 20 ("hit_per_page", 50), # default:15, max:50 21 ("offset", 1), # 検索開始位置(デフォルト:1) 22 ] 23 24 # Generate URL. 25 url += "?{0}".format(urllib.parse.urlencode(query)) 26 27 # Execute API 28 try: 29 result = urllib.request.urlopen(url).read() 30 return result 31 except: 32 raise Exception("APIアクセスに失敗しました。") 33 34def parse_json(json_f): 35 # parse json 36 parsed_json = json.loads(json_f) 37 38 # Check error. 39 if 'error' in parsed_json: 40 if 'message' in parsed_json: 41 raise Exception('{0}'.format(parsed_json['message'])) 42 else: 43 raise Exception('データ取得に失敗しました') 44 45 # Save json. 46 with open('output.json', 'w') as f: 47 json.dump(parsed_json, f) 48 49 # 該当件数 50 total_hit_count = parsed_json['response'].get('total_hit_count', 0) 51 52 # 1回のリクエストで得る最大投稿件数(デフォルト:15、上限:50) 53 hit_per_page = parsed_json['response'].get('hit_per_page', 0) 54 55 # ヒット件数が0以下なら終了 56 if total_hit_count <= 0 or hit_per_page <= 0: 57 raise Exception("指定した内容ではヒットしませんでした。") 58 59 # ヒット件数表示 60 print("{0}件ヒットしました。".format(min(total_hit_count, hit_per_page))) 61 62 #input_num = int(input("追加で取得するコメントの文章数を入力してください: ")) 63 64 f = open('answer.txt', 'w') 65 66 # 応援口コミデータ取得 67 for (_, seq) in enumerate(parsed_json['response']): 68 line = [] 69 70 try: 71 photo = parsed_json["response"]["{0}".format(seq)]["photo"] 72 except: 73 continue 74 75 # コメント 76 if(photo.get('comment', None)): 77 userComment = photo.get('comment') 78 removeCharacters = str.maketrans({ 79 '\r': '', 80 '\n': '', 81 '\t': '' 82 }) 83 userComment = userComment.translate(removeCharacters) 84 commentLines = re.split('。|!|♪', userComment) #とりあえず'。'と'!'で分割 85 line = [] 86 REPEAT = 3 87 for i, commentLine in enumerate(commentLines): 88 if menu_name in commentLine: 89 line.append([commentLine]) 90 91 offset = 1 92 while True: 93 # マイナスのindexにならないようにする 94 if i - offset >= 0: 95 tmp = commentLines[i-offset] 96 else: 97 tmp = "" 98 line[-1].append(tmp) 99 100 # menu_nameが含まれたら探索を終了する終了条件 101 if (any(menu_name in t for t in line[-1][1:]) 102 and (offset >= REPEAT) 103 ): 104 break 105 106 # プラス側のインデックスは例外処理で対処 107 try: 108 tmp = commentLines[i+offset] 109 except IndexError: 110 tmp = "" 111 line[-1].append(tmp) 112 113 # menu_nameが含まれたら探索を終了する終了条件 114 if (any(menu_name in t for t in line[-1][1:]) 115 and (offset >= REPEAT) 116 ): 117 break 118 119 # 終了条件 120 if offset == REPEAT: 121 break 122 123 offset += 1 124 125 print(line) 126 #改行区切りで出力 127 #f.write("\n".join(line[0])) #lineはリストのリストになっているはず(?) 128 f.close() 129 130def main(): 131 try: 132 result = gnavi_api() 133 parse_json(result) 134 except Exception as e: 135 print(e) 136 137if __name__ == '__main__': 138 sys.exit(main()) 139

###実行結果

50件ヒットしました。 [] [] [['ソースではなくしょっぱく味付けされたキャベツでいただく風変わりなとんかつ', '', 'シメはお茶をかけてお茶漬けにしてサッパリと', '', '', '', '']] [] [['日本人大好き黒豚とんかつ', '', '', '', '', '', '']] [['厚切りとんかつ', '', '食べ応え満点', '', '', '', '']] [] [['わらじとんかつは大きさも味のよさも横綱級', '横綱の豚が目印のお店', '名古屋にきたら立ち寄るべし', '', '', '', '']] [['この日はひれとんかつをいただきました', '', 'お肉もとても柔らかいし、とてもボリュームがあり、お値段以上の満足度でした', '', 'でももうちょっと味噌だれがほしかったかな…次は味噌だれとソースのハーフ&ハーフという贅沢メニューにトライしようかな~っと思っています☆', '', '']] [] [['ジューシーなとんかつ', '', 'ボリュームも丁度良くて美味', '', '', '', '']] [] [] [['リーズナブルでガッツりととんかつが食べられます', '', '', '', '', '', '']] [] [] [['とんかつが食べたくなるなら絶対ココ', '', 'お肉もジューシーです', '', '', '', '']] [] [['普通のとんかつソースも選べましたがやはり味噌で食べました', '初味噌かつ', '', '', '', '', '']] [] [] [['矢場とんと言えば、やっぱり「わらじとんかつ」でしょう', '', '独特のソースがたまりません', '', 'かなりのボリュームなのにペロリです', '', '']] [] [] [['ボリューム満点のミルフィーユのとんかつ', '', 'あっさりと食べられました', '', '', '', '']] [['とんかつで有名な「かっぱ」のお手頃・ちょうど良い量のトンカツのセットと言えば「ミニとんかつ定食」', '', 'ミニと言っても十分な大きさがあり、ライスと千切りキャベツ、ポテト&マカロニサラダとお味噌汁がついています', '', 'ソースはカレー風味に感じ、スパイシーで、サクサクの衣に熱々のお肉がとても美味しかったです', '', 'ちなみに名代とんかつの単品は900円です'], ['ちなみに名代とんかつの単品は900円です', 'ソースはカレー風味に感じ、スパイシーで、サクサクの衣に熱々のお肉がとても美味しかったです', '', 'ミニと言っても十分な大きさがあり、ライスと千切りキャベツ、ポテト&マカロニサラダとお味噌汁がついています', '', 'とんかつで有名な「かっぱ」のお手頃・ちょうど良い量のトンカツのセットと言えば「ミニとんかつ定食」']] [['看板通りおすすめのとんかつが嬉しい定食に', '', 'とんかつは肉にコダワリが有るらしいが、揚げ油がサッパリしているので、良質の豚肉の味がしっかりと味わえる', '', 'ごはん、味噌汁、キャベツはお代わり自由', ''], ['とんかつは肉にコダワリが有るらしいが、揚げ油がサッパリしているので、良質の豚肉の味がしっかりと味わえる', '看板通りおすすめのとんかつが嬉しい定食に', 'ごはん、味噌汁、キャベツはお代わり自由', '', '味噌汁は+50円で豚汁に変更出来るのも嬉しい', '']] [['名古屋名物の味噌のソースがかかった巨大なとんかつです', '', '味が濃い目で、白いご飯がすすみます', '', 'お肉はとてもやわらかいです', '', 'おなかをペコペコにしていきたいお店です']] [['とんかつがかなりさくさく感があり、お肉が柔らかくて、ルーとの相性がいいですよね', 'なんと言ってもボリューム満点なところがいいですね', '', '', '', '', '']] [] [['1350円と少々値段はしますが今まで食べたとんかつの中で一番美味しいです', '', '', '', '', '', '']] [] [['とんかつのお茶漬けは、賛否両論がありそうかも', 'すずや名物の「とん茶」、画像は「大サイズ」\u3000食べ方は、初めに普通に食べて残り3切れぐらいになったらお茶漬けにします', '?すずやに行ったら、1度は注文したいメニューだと思います', '', '', '', '']] [] [['ちょっとレトロな店内で、とんかつをお茶漬けにするなんて、と過去にショックを受けたメニューのひとつです', '', '最初は鉄板に乗ったそのままで、次にほうじ茶をかけてお茶漬けにして', '', 'ごはん、キャベツがおかわり自由なので足りない人は追加できます', '', 'さくさくのとんかつは、やっぱりできたてがおいしい'], ['さくさくのとんかつは、やっぱりできたてがおいしい', 'ごはん、キャベツがおかわり自由なので足りない人は追加できます', '', '最初は鉄板に乗ったそのままで、次にほうじ茶をかけてお茶漬けにして', '', 'ちょっとレトロな店内で、とんかつをお茶漬けにするなんて、と過去にショックを受けたメニューのひとつです']] [['とんかつとキャベツをご飯に乗っけてお茶漬けで食べるというジャンクフードのノリで食べられる料理でした', '名物と聞いていただきました', '量がけっこうガッツリです', '', '', '', '']] [['とんかつのソースはお味噌かソース選べます', '', '迷って両方用意してくださいました', '', '', '', '']] [['わらじとんかつ定食1680円味噌ソースのカツと普通のトンカツの2枚がセットになった定食味噌ソースは甘めの八町味噌でごはんがすすみます', '', '', '', '', '', '']] [['とんかつ盛合せライス950円を食しました', '', 'ロースカツとヒレカツ、そしてライスが付いてきます', '', 'とんかつは上品で柔らかい豚肉を使って、カリカリジューシーに揚げてあります', ''], ['とんかつは上品で柔らかい豚肉を使って、カリカリジューシーに揚げてあります', 'ロースカツとヒレカツ、そしてライスが付いてきます', 'この場所でこのボリュームでこの値段は、かなりお得ですよね', 'とんかつ盛合せライス950円を食しました', '美味しいランチを楽しめました', '']] [] [['甘めの味噌がとんかつと合っていると思います', 'アツアツで提供されてくるのも嬉しいですね', '', '値段の割には結構なボリュームがあります', '', '', '']] [['名前のとおり、「わらじ」かと思うくらい大きいとんかつがのっています', '', 'みそだれとソースの二種類がかかっていて2つの味を楽しめます', '', 'ご飯もたっぷりでかなりボリュームのある一品でした', '', '']] [] [] [['鉄板に焼けたしょうゆの匂いと味が、とんかつの衣とキャベツに絡み合って食欲をそそります', '', '', '', '', '', '']] [['サクサクの衣をまとった揚げたてのとんかつは、ごはんにピッタリ', 'お肉が柔らかくてジューシー', 'ごはんやお味噌汁もとっても美味しいです', '', '', '', '']] [] []

試したこと

コメントアウトしていますが全体図がf.write("\n".join(line[0]))で実行しても出力されずエラーが出力される。

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

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

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

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

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

mather

2018/09/07 05:46

「出力すると2次元配列になっているのですが」とありますが実際の出力例はどうなっているのですか?
mather

2018/09/07 05:48

何の予備知識もなく質問文を読むと意味がわからないです。具体的な質問はなんですか?
rrrrrrrry

2018/09/07 05:59

print(line[2][0])としたら"'ソースではなくしょっぱく味付けされたキャベツでいただく風変わりなとんかつ'"というような出力が出るようにしたいのが一点と、初歩的なんですがf.writeの使い方を知りたいです。
guest

回答1

0

ベストアンサー

提示していただいた出力は print(line) の結果ですよね?
ということは、 line が毎回リセットされていることになります。具体的にはこの部分。

# 応援口コミデータ取得 for (_, seq) in enumerate(parsed_json['response']): line = []

さらにこの部分。

commentLines = re.split('。|!|♪', userComment) #とりあえず'。'と'!'で分割 line = []

2次元配列で全部取得したいなら、これをなんとかしましょう。

f.write("\n".join(line[0])) の部分はそもそも line[0] が存在しない場合はエラーになりますよね。

>>> a = [] >>> a[0] Traceback (most recent call last): File "<stdin>", line 1, in <module> IndexError: list index out of range

エラーに関して質問には何も書かれていませんでしたが、エラーが発生して出力できていないのではないでしょうか。

投稿2018/09/07 07:46

mather

総合スコア6753

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

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

rrrrrrrry

2018/09/10 06:42

2点の質問についてです。 1.lineが毎回リセットされてしまってそのようなことが起こってしまうことは理解できました。私が調べた限りではこの方法しか理解できず、コードを書いてしまったのでもしよろしければ効率的な方法、もしくは参考になるサイトなどありましたら教えていただきたいです。 2.mather様のおっしゃる通りです。line[0]がそもそも存在しないためにそのようなことになっているのには理解することができました。ただ、line[0]をlineにしてもできないのはなぜなのかがわからないのでそこをご教授いただけますでしょうか? プログラム初心者の質問に丁寧に答えてくださってありがとうございました。
mather

2018/09/13 02:50

「この方法しか理解できず」という部分が謎ですが、やりたいことをまずは言葉で手順化しましょう。 - 「各コメントを格納する空配列」を用意して、コメントを一つ一つ「処理して」格納する - コメントの処理とは、コメントを行ごとに分解して、特定のキーワードを含む行だけの配列にすること 分解して整理すればどの時点で初期化してあるべきか、何を操作すべきかわかるのではないでしょうか。 まず、何でもかんでもどこかにある正解を知ろうとせずに、自分で何をすればよいのか考えないといつまで経ってもプログラムを正しく修正することはできません。 「line[0]をlineにしてもできない」というのはどの部分を指すのかわかりませんし、「何ができない」のか全然わかりません。変えたのはどの部分か、なにが問題なのか、本当はどうなっていることが期待されているのか、を自分の言葉で整理してちゃんと伝える努力をしてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問