@wata2023

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

間違えてるコードを教えてください

英語の4択問題なのですが
正しい答えが選ばれません キーエラーも出ます
jupyter notebook
でコーディングしています
よろしくおねがいします

import re
import random

source = ('englishwords11.txt')

with open(source,encoding="utf-8") as f:
    data = f.read()

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

meanings = []
for word in ja:
    m = re.sub('\t|\n','',word)
    meanings.append(m)

words_dict = dict(zip(english_words,meanings))
print(words_dict)

n_tests =1
n_questions = 20

for test_num in range(n_tests):  
    with open('英単語テスト_{:02d}.txt'.format(test_num+1),'w') as f:

        f.write('出席番号:\n'
                '名前:\n\n'
                '第{}回 英単語テスト\n\n'.format(test_num + 1))
        
        for question_num in range(n_questions):
            question_word = random.choice(english_words)
            correct_answer = words_dict[question_word]
    
            meanings_copy = meanings.copy()
            meanings_copy.remove(correct_answer)
            wrong_answers = random.sample(meanings_copy, 3)
            
            answer_options = [correct_answer] + wrong_answers

            random.shuffle(answer_options)

            f.write('問{}. {}\n\n'.format(question_num + 1, question_word))

            for i in range(4):
                f.write('{}. {}\n'.format(i + 1, answer_options[i]))
            f.write('\n\n')        

考えたのですが
correct answerがちがうのでしょうか?

a.m 午前
about についてに関する について、に関する
activity 活動
actor 俳優
after ~のあとに
afternoo 午後
again もう一度、再び、また
against に対抗して、反対して
age 年齢
all 全部、全員、全て、みな
along に沿って
also もまたさらに
always いつも
am です、ますにいる、ある
an 1つの、1人の
and それに、そして、それから
animal 動物
another ほかの、別の
apple りんご
apri 4月
apron エプロン、前かけ
are です、ます にいる、ある
area 区域、場所、地域
around の近くにのまわりを回ってのあちこちに
art 美術
as として
at 場所に 時刻 に向かって
ate 食べた
august 8月
autumn 秋
away はなれて、去って
back 戻って、返して
bad 悪い
bag かばん
baseball 野球
bath 入浴
be である、になる
beach 浜、海辺
bean 豆
bear クマ
beautiful 美しい
become になる
bed ベッド
before の前に
behind の後ろに
bicycle 自転車
big 大きい
bike 自転車
bird 鳥
birthday 誕生日
black 黒い
blue 青い
body 身体
book 本
bookstore 本屋
borrow を借りる
bought 買った(過去形)
box 箱
boy 少年
bread パン
breakfast 朝食
brother 兄弟
brown 茶色
brush をみがく
busy 忙しい
but しかし、けれども
buy を買う
by 手段方法原因 によって 場所のそばに "
buid 建てる

出席番号:
名前:

第1回 英単語テスト

問1. actor

  1. 野球
  2. ~のあとに
  3. の後ろに

問2. buid

  1. 午前
  2. を買う
  3. 誕生日

問3. m

  1. 食べた
  2. 少年
  3. 区域、場所、地域
  4. についてに関する について、に関する

問4. afternoo

  1. もう一度、再び、また
  2. もまたさらに
  3. です、ますにいる、ある
  4. 朝食

問5. bean

  1. クマ
  2. ~のあとに
  3. を借りる
  4. いつも

問6. art

  1. です、ます にいる、ある
  2. 身体
  3. ~のあとに
  4. として

問7. bicycle

  1. 大きい
  2. 茶色
  3. です、ます にいる、ある
  4. 建てる

問8. area

  1. の近くにのまわりを回ってのあちこちに
  2. 俳優
  3. をみがく
  4. いつも

問9. along

  1. 身体
  2. 8月
  3. もまたさらに
  4. クマ

問10. become

  1. 区域、場所、地域
  2. ベッド
  3. 4月
  4. 朝食

問11. baseball

  1. 4月
  2. をみがく
  3. 入浴
  4. 手段方法原因 によって 場所のそばに"

問12. against

  1. 兄弟
  2. 年齢
  3. 野球
  4. もまたさらに

問13. brother

  1. として
  2. 茶色
  3. を買う
  4. りんご

問14. big

  1. 自転車
  2. 兄弟
  3. 1つの、1人の
  4. をみがく

問15. behind

  1. かばん
  2. 悪い
  3. です、ますにいる、ある
  4. 自転車

問16. be

  1. 自転車
  2. 浜、海辺
  3. エプロン、前かけ
  4. に対抗して、反対して

問17. an

  1. になる
  2. 買った(過去形)
  3. 動物
  4. それに、そして、それから

問18. bed

  1. に対抗して、反対して
  2. の前に
  3. 建てる
  4. 戻って、返して

問19. baseball

  1. 入浴
  2. に沿って
  3. である、になる
  4. を借りる

問20. behind

  1. を借りる
  2. 青い
  3. 自転車
  4. についてに関する について、に関する

実行ファイルです
大変困っています
よろしくおねがいします

0 likes

1Answer

特にPythonはインデントが命です。
まずは、下記サイトを参照して、コードブロックを正しく書き直してください。
投稿する前に、「プレビュー」を見て体裁等の崩れがないか確認するようにしましょう。


次に、ファイルenglishwords11.txtの内容も掲示してください。セキュリティやライセンスにて、そのままの開示が無理な場合は、内容の書式や例をせめて数件挙げてください。
ファイル英単語テスト_nn.txtも同様。

3Like

Comments

  1. @wata2023

    Questioner

    コメントありがとうございます
    直しましたのでよろしくお願いします。

  2. Traceback (most recent call last):
      File "/Users/USER/test/test.py", line 32, in <module>
        correct_answer = words_dict[question_word]
                         ~~~~~~~~~~^^^^^^^^^^^^^^^
    KeyError: ‘buid’
    

    何度か実行すると、↑上のエラーが起きますね。
    起きたり、起こらなかったりするのは、キーワードの選択が乱数により行われているためです。

    調べてみると、

    プログラムの前半部で、ファイルenglishwords11.txtを読み込んで作成する4つの変数がありますが、
    それぞれの個数を数えると、以下のようになっています。

    print(len(english_words))
    70
    print(len(ja))
    68
    print(len(meanings))
    68
    print(len(words_dict))
    68
    

    この個数の不一致により、キーワードを乱数で取得するところで矛盾が起きることが原因です。
    ファイルenglishwords11.txtは69行であるため、本来はどの変数も69個になることを期待していると思われる。

        question_word = random.choice(english_words)
        correct_answer = words_dict[question_word]
        english_wordsから選んだquestion_wordがwords_dictに存在しない場合がある
    

    個数の不一致を引き起こす原因は、ファイルenglishwords11.txtのパースの仕方だと思われます。
    下記の正規表現[a-z]+の見直しが必要でしょう。

    english_words = re.findall('[a-z]+',data, re.MULTILINE)
    ja = re.findall(r'\s.*\n',data)
    
  3. print(len(ja))
    68

    これの原因は、englishwords11.txtの最終行に改行が無かったことでした。
    改行を入れたら、69になりました。


    print(len(english_words))
    70

    こちらの原因は、前に書いた通り、正規表現[a-z]+の問題です。
    englishwords11.txtをみると、"英単語","スーペース","日本語意味"となっていますが、先頭の単語は"a.m"となっていて、a-z以外の文字を使っていることで、"a"と"m"が分離して別な単語になっていました。

    english_words = re.findall('^(.*?)\s',data, re.MULTILINE) で対策できます。

    ^(.*?)\sの意味は、「行頭からスペースの前までの最短一致の文字」という内容です。
    この変更だけで、期待する動作になったと思います。

    もし、a.mだけが例外なら、[a-z.]+でも対策できます。

Your answer might help someone💌