前提・実現したいこと
PyQというプログラミング学習サービスで
for row in f:
if 'good' in path: good_list.append(row)
if 'bad' in path: bad_list.append(row)
上記の処理をリスト内法表記や高階関数を使ったものに書き換えて見たのですが、
good_list, bad_listを参照しようとするとエラーが出てしまいます。
なぜなのか考えて見たのですがさっぱり見当がつきません。
よろしくお願いいたします。
発生している問題・エラーメッセージ
Traceback (most recent call last) File "/home/appuser/venv/lib/python3.6/site-packages/flask/app.py", line 2309, in __call__ return self.wsgi_app(environ, start_response) File "/home/appuser/venv/lib/python3.6/site-packages/flask/app.py", line 2295, in wsgi_app response = self.handle_exception(e) File "/home/appuser/venv/lib/python3.6/site-packages/flask/app.py", line 1741, in handle_exception reraise(exc_type, exc_value, tb) File "/home/appuser/venv/lib/python3.6/site-packages/flask/_compat.py", line 35, in reraise raise value File "/home/appuser/venv/lib/python3.6/site-packages/flask/app.py", line 2292, in wsgi_app response = self.full_dispatch_request() File "/home/appuser/venv/lib/python3.6/site-packages/flask/app.py", line 1815, in full_dispatch_request rv = self.handle_user_exception(e) File "/home/appuser/venv/lib/python3.6/site-packages/flask/app.py", line 1718, in handle_user_exception reraise(exc_type, exc_value, tb) File "/home/appuser/venv/lib/python3.6/site-packages/flask/_compat.py", line 35, in reraise raise value File "/home/appuser/venv/lib/python3.6/site-packages/flask/app.py", line 1813, in full_dispatch_request rv = self.dispatch_request() File "/home/appuser/venv/lib/python3.6/site-packages/flask/app.py", line 1799, in dispatch_request return self.view_functions[rule.endpoint](**req.view_args) File "/home/appuser/work/main.py", line 32, in index fortune['message'] = random.choice(good_list) File "/usr/lib/python3.6/random.py", line 260, in choice raise IndexError('Cannot choose from an empty sequence') from None IndexError: Cannot choose from an empty sequence
該当のソースコード
python3
1# 1: 大吉、2: 吉、3: 中吉、4: 小吉、5: 凶、6:大凶 2import random 3from flask import Flask, render_template, request 4 5app = Flask(__name__) 6 7GOOD_FILE = 'input/fortune_good.txt' 8BAD_FILE = 'input/fortune_bad.txt' 9 10 11@app.route("/") 12def index(): 13 good_list = [] 14 bad_list = [] 15 for path in [GOOD_FILE, BAD_FILE]: 16 with open(path, encoding='utf-8') as f: 17 #うまく動く 18 for row in f: 19 if 'good' in path: good_list.append(row) 20 if 'bad' in path: bad_list.append(row) 21 22 #fortune_list = list(f) 23 24 #リスト内法表記 エラー発生 25 #good_list = [row for row in fortune_list if 'good' in path] 26 #bad_list = [row for row in fortune_list if 'bad' in path] 27 28 #高階関数へ書き換え エラー発生 29 #good_list = list(filter(lambda x: 'good' in path, fortune_list)) 30 #bad_list = list(filter(lambda x: 'bad' in path, fortune_list)) 31 32 #うまく動く 33 #good_list.extend([row for row in fortune_list if 'good' in path]) 34 #bad_list.extend([row for row in fortune_list if 'bad' in path]) 35 fortune = {} 36 if request.args.get('fortune', ''): 37 fortune['no'] = random.randint(1, 6) 38 if fortune['no'] <= 4: 39 fortune['message'] = random.choice(good_list) 40 if fortune['no'] >= 5: 41 fortune['message'] = random.choice(bad_list) 42 return render_template('index.html', fortune=fortune) 43
試したこと
補足情報(FW/ツールのバージョンなど)
ipythonを使ってませんか? ←すみません、勘違いでした。お気になさらずに
返信ありがとうございます。ipythonは使っていないのですが、PyQというプログラミング学習サービス上で発生しています。あまり関係ないと思っていましたが、書き換え方に問題がないのであればPyQ固有の問題なのかもしれません。
randomが吐いている例外のようなので、質問のコードは関係ないのでは?(正しく動くかどうかは別にして) テストデータ生成にrandom使ってるとか。
回答ありがとうございます。コードを変更するとエラーがでるのでそこが原因だと考えました。エラーメッセージの内容はlistが空だと言っていると理解していますがあっているのでしょうか?エラーメッセージをいまいち理解できていません。エラーコード全文を追記させていただきましたので見ていただけたらと思います。
このエラーってリスト内法表記だけじゃないですか?高階関数でも出ます?
返信ありがとうございます。PyQには判定ボタンがありコードをテストして確認しているようです。高階関数の場合はたまに合格判定になり、リスト内法表記だと何回押しても合格判定にはなりません。どういうことでしょうか?
fortune['message'] = random.choice(good_list) は自分で書いたコードですか? 書いてないコードですか?
返信ありがとうございます。その部分は自分で書いた部分です。その部分に適当なリストを入れてみたところエラーが出なくなったのでgood_list自体に問題があるのではと考えています。