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

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

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

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

672閲覧

英単語テストの選択肢がうまく表示されない

gomitrash

総合スコア3

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/02/12 13:20

リンク内容
上の方の動画を参考にして英単語テストを作ろうとしています。

python(windows)を利用して、50問ずつの単語テスト50回分を作ろうとしているのですが、実行結果が以下のようになってしまいます。実現したい結果は、①選択肢を4つ表示させること。②正解を一つ含んだ選択肢にすることです。
しかし、実際の以下の実行結果の場合、選択肢が4つそろわない、正解が含まれていないということになっています。
どうすればよいでしょうか。

出席番号:
名前:

第1回 英単語テスト

問い1. invent

  1. …を作り出す,…を創造する
  2.  
  3. …かなと思う/驚き
  4. …について述べる,…を描写する

問い2. tend

  1. …を想定する,…とみなす
  2.  
  3. …に聞こえる/音
  4. …をうち負かす

問い3. beat

  1.  
  2. 同意する,賛成する
  3. …を叩く,
  4. …を改善する

問い4. advise

  1. …を調節する,順応する
  2.  
  3.  
  4. …を分かち合う

問い5. belong

  1. …であるようだ
  2. …する傾向がある
  3. steal
  4.  

問い6. remember

  1.  
  2. 勝つ,…を勝ち取る
  3. …を避ける
  4.  

途中省略
~~問い50まで 前50回分

python

1コード 2import re 3import random 4 5source = 'englishword.txt' 6 7with open(source ,encoding="utf-8") as f: 8 data = f.read() 9 10english_words = re.findall('[a-z]+', data) 11ja = re.findall('\s.*\n', data) 12 13meanings = [] 14for word in ja: 15 m = re.sub('\t|\n', '', word) 16 meanings.append(m) 17 18words_dict = dict(zip(english_words, meanings)) 19 20 21n_tests = 50 22n_questions = 50 23 24for test_num in range(n_tests): 25 with open('英単語テスト_{:02d}.txt'.format(test_num + 1), 'w', encoding='utf-8')as f: 26 27 f.write('出席番号:\n' 28 '名前:\n\n' 29 '第{}回 英単語テスト\n\n'.format(test_num + 1)) 30 31 32 for question_num in range(n_questions): 33 question_word = random.choice(english_words) 34 correct_answer = words_dict[question_word] 35 36 meanings_copy = meanings.copy() 37 meanings_copy.remove(correct_answer) 38 wrong_answers = random.sample(meanings_copy, 3) 39 40 answer_options = [correct_answer] + wrong_answers 41 42 random.shuffle(answer_options) 43 44 f.write('問い{}. {}\n\n'.format(question_num + 1, question_word)) 45 46 for i in range(4): 47 f.write('{}. {}\n'.format(i + 1, answer_options[i])) 48 f.write('\n\n')

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/02/12 14:34 編集

そもそも、用意したテキストデータから、辞書データを「正しく」作成できているか確認されたのでしょうか? 簡単なデバッグの話です。 たとえば words_dict = dict(zip(english_words, meanings)) の下に print('\n'.join(f"{k}:{v}" for k,v in words_dict.items())) という一文を挿入して実行したとき、出力された結果(問題文より前の部分)の中に抜けていたり、ずれていたりする行がないか確認したのでしょうか? (もし正しいデータが作れているならば 「英単語:日本語」がずらっと抜けなく表示されているはずです) しかし、もし、想定しているデータになっていない場合は、もともとの'englishword.txt'の構造に対して、 上記質問文のやり方では正しくデータが作れていない可能性が高いです。 または、もともとの'englishword.txt'の構造そのものがおかしいか。
t_obara

2021/02/12 15:44

> 選択肢が4つそろわない、正解が含まれていない このことから、正解を抽出する部分や正解を出力する部分など正解を扱う部分に問題があると推測されます。上の方もおっしゃっているような部分を確認した上で、こちらについてデバッグしてみると良いかと思います。
guest

回答2

0

ベストアンサー

質問文のコードが読み込むファイル「englishword.txt」が、コードが想定する形式になっていません。

コードのパース部分からは、「英単語+タブ(\t)+日本語+改行(\n)」という形式を想定していることがわかります。あなたの「englishword.txt」を、この形式に修正してください。

以下、細かい説明。

質問文のリンク先の動画を見てみましたが、基になる単語を「英語漬け.com」(https://eigo-duke.com/)というサイトの単語表からテキストエディターにコピペして作っていますね。

この動画が作られた当時の単語表と、現在の同じサイトの単語表では、表の内容が変わっています
英単語と日本語だけでなく、音声再生用のボタンやチェックボックスが追加されているので、ブラウザーから単なるコピペするだけでは、質問のコードが想定しているデータが得られません。

コピペで得られたテキストを(不要な部分を削除したり、行を連結したりして)加工し、1行にひとつずつ英単語と日本語がタブ区切りで書かれたデータを作ってやると、質問文のコードのままで、「選択肢が4つ揃い、正解が含まれている」実行結果が得られました。

なお、現在のコードのままでは、「日本語の説明中に英小文字があるとパースが破綻する」という問題と、「正規表現に\sを指定しようとして失敗している」という問題があるので、以下のように修正したほうがいいでしょう。

Diff

1-english_words = re.findall('[a-z]+', data) 2+english_words = re.findall('^[a-z]+', data, re.MULTILINE) 3-ja = re.findall('\s.*\n', data) 4+ja = re.findall(r'\s.*\n', data)

投稿2021/02/12 15:47

編集2021/02/12 15:58
Daregada

総合スコア11990

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

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

gomitrash

2021/02/13 07:48

アドバイスありがとうございます。 englishword.txtの内容を英単語+タブ(\t)+日本語+改行(\n)の形式に変更し、 -english_words = re.findall('[a-z]+', data) +english_words = re.findall('^[a-z]+', data, re.MULTILINE) -ja = re.findall('\s.*\n', data) +ja = re.findall(r'\s.*\n', data) に変更したら、選択肢が4つそろい、正解を含られた選択肢を作ることができました。
guest

0

python

1import re 2import random 3 4source = 'englishword.txt' 5 6with open(source ,encoding="utf-8") as f: 7 data = f.read() 8 9**english_words = re.findall('[a-z]+', data, re.MULTILINE) 10ja = re.findall(r'\s.*\n', data) ** 11 12meanings = [] 13for word in ja: 14 m = re.sub('\t|\n', '', word) 15 meanings.append(m) 16 17words_dict = dict(zip(english_words, meanings)) 18print('\n'.join(f"{k}:{v}" for k,v in words_dict.items())) 19 20n_tests = 50 21n_questions = 50 22 23for test_num in range(n_tests): 24 with open('英単語テスト_{:02d}.txt'.format(test_num + 1), 'w', encoding='utf-8')as f: 25 26 f.write('出席番号:\n' 27 '名前:\n\n' 28 '第{}回 英単語テスト\n\n'.format(test_num + 1)) 29 30 31 for question_num in range(n_questions): 32 question_word = random.choice(english_words) 33 correct_answer = words_dict[question_word] 34 35 36 37 meanings_copy = meanings.copy() 38 meanings_copy.remove(correct_answer) 39 wrong_answers = random.sample(meanings_copy, 3) 40 41 answer_options = [correct_answer] + wrong_answers 42 43 random.shuffle(answer_options) 44 45 f.write('問い{}. {}\n\n'.format(question_num + 1, question_word)) 46 47 for i in range(4): 48 f.write('{}. {}\n'.format(i + 1, answer_options[i])) 49 f.write('\n\n')

以下のコードを直すことによって解決しました

python

1-english_words = re.findall('[a-z]+', data) 2+english_words = re.findall('^[a-z]+', data, re.MULTILINE) 3-ja = re.findall('\s.*\n', data) 4+ja = re.findall(r'\s.*\n', data)

投稿2021/02/13 07:51

gomitrash

総合スコア3

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

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

gomitrash

2021/02/13 07:55

しかし、新たにkeyerrorが発生したのでベット質問します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問