前提・実現したいこと
英語の穴埋め問題を作っています。
「回答を入力してください」と表示された後に回答を問題番号ごとに入力するようにしていますが、入力した文字列と正解の文字列が同じでも同じ文字列として判定されないため、同じ文字列と判定されるようにしたいです。
テスト用としてstr.pyを作成しています。str.pyのようにあらかじめ解答と答えを用意しておくとうまくいくようです。
###配列について
正解となる文字列は単語ごとにリストとして、correct_wordsに格納されています。
["I have an apple"]から
["I","have","an","apple"]
という感じになっています。
穴埋め問題する配列は、wordsとしています。
回答を入力する配列は、回答入力部にて、ans_wordsとしてします。
###変数について
- space_num: 空白に番号をつけています。
- q_nums: words配列内の空白にして問題番号に置き換えているindexを格納しています。
なのでcorrect_words配列のq_numsを頭から指定すれば、ちょうど空欄になっている場所の回答の情報を得ることができます。
- q_nums_index: q_numsを頭から回すための変数です。
str.pyではappleだけを該当の配列にそれぞれ格納して、プログラム内で判定しています。
この書き方だとうまくいきますが、input_str.pyのように標準入力するとうまくいきません。
この違いについてもわかる方がいれば、教えていただきたいです。
該当のソースコード
####str.py
python
1#str.py 2correct_words=["apple"] 3ans_words=["apple"] 4q_nums=[0,3,4] 5q_nums_index=0 6 7if str(correct_words[q_nums[q_nums_index]]) == str(ans_words[q_nums_index]): 8 print("回答:"+str(correct_words[q_nums[q_nums_index]])) 9 print("入力した答え:"+str(ans_words[q_nums_index])) 10 print("\n"+str(q_nums_index+1)+":正解") 11 print("答え:"+correct_words[q_nums[q_nums_index]]) 12 print("\n") 13else: 14 print("回答:"+str(correct_words[q_nums[q_nums_index]])) 15 print("入力した答え:"+str(ans_words[q_nums_index])) 16 print("\n"+str(q_nums_index+1)+":不正解") 17 print("答え:"+correct_words[q_nums[q_nums_index]]) 18 print("\n")
####str.pyのOutput
回答:apple 入力した答え:apple 1:正解 答え:apple
####input_str.py
python
1#input_str.py 2# coding: UTF-8 3import random 4import copy 5 6rate=50#最初はrateを50に設定 7space_num=0 8q_nums=[] 9 10lines=["I have an apple"] 11# 行のリストをループして半角空白で分割して単語のリストの作成 12for l_i, line in enumerate(lines):#enumerateによってl_iに0から番号が割り当てられる 13 words = line.split()#1行ごとに、単語ごと分けている。wordsはリスト(配列) 14 correct_words=copy.copy(words)#正しい答えを残すための配列 15 16 ''' 17 wordsの中に特殊記号が含まれているか判断する。 18 もしあれば記号を削除して、l_iを保存する。フラグも立てる 19 フラグを使って、lines[l_i] = " ".join(words) を実行するときに後から +',' で記号を追加する 20 ''' 21 22 # 一行ごとに単語のリストをループ 23 for w_i, word in enumerate(words):#enumerateによってwordにw_iに0から番号が割り当てられる 24 25 for i,spell in enumerate(word): 26 #wordの中にピリオドなどがあるか見る 27 if '.' == spell: 28 flag=1 29 period_num=w_i 30 elif '?' == spell: 31 flag=2 32 ques_num=w_i 33 elif ',' == spell: 34 com_flag=1 35 com_num=w_i 36 elif '\n' == spell: 37 newLine_flag=1 38 newLine_num=w_i 39 else: 40 flag=0 41 com_flag=0 42 newLine_flag=0 43 44 #ピリオドとクエスチョンマークを消す 45 if flag==1:#ピリオド 46 words[w_i]=words[period_num].strip('.') 47 elif flag==2:#クエスチョン 48 words[w_i]=words[ques_num].strip('?') 49 50 #コンマを消す 51 if com_flag==1: 52 words[w_i]=words[com_num].strip(',') 53 54 #改行文字を消す 55 if newLine_flag==1: 56 words[w_i]=words[newLine_num].strip('\n') 57 58 #print(words) 59 # 確率で穴あけをする 60 if rate > random.random()*100: 61 words[w_i] = "____" 62 q_nums.append(w_i) 63 if com_flag==1: 64 words[w_i]+=',' 65 elif com_flag==1: 66 words[w_i]+=',' 67 68 #空白に番号をつけてく 69 for word_num, word in enumerate(words): 70 if '____' in word: 71 space_num+=1 72 words[word_num]='__'+str(space_num)+'__' 73 else: 74 continue 75 76 # 単語のリストを1行の文字列にし、表示する 77 ''' 78 if文で記号を追加する。 79 ''' 80 if flag==1: 81 lines[l_i] = " ".join(words)+'.' 82 elif flag==2: 83 lines[l_i] = " ".join(words)+'?' 84 elif newLine_flag==1: 85 lines[l_i] = " ".join(words)+'\n' 86 else: 87 lines[l_i] = " ".join(words) 88 89 print(lines[l_i]) 90 #print(space_num) 91''' 92回答を入力するための配列とfor文を用意する。 93回答をans_words配列に格納する 94correct_wordsをもとに、linesをまた一行ごとにfor文で回して、入力した回答が配列の番号と合っているかを見る 95''' 96 97#回答入力部 98num_while=1#while文のための値 99ans_words=[] 100print("\n回答を入力してください") 101while num_while <= space_num:#問題番号までループが回る 102 ans_word=input(str(num_while)+":").split('\n') 103 ans_words.append(str(ans_word)) 104 num_while+=1 105print("\n") 106print("ans_words:"+str(ans_words)) 107print("correct_words"+str(correct_words)) 108print("\n") 109 110#回答判定部 111q_nums_index=0 112while q_nums_index < len(q_nums): 113 if correct_words[q_nums[q_nums_index]]== str(ans_words[q_nums_index]): 114 print("回答:"+str(correct_words[q_nums[q_nums_index]])) 115 print("入力した答え:"+str(ans_words[q_nums_index])) 116 print("\n"+str(q_nums_index+1)+":正解") 117 print("答え:"+correct_words[q_nums[q_nums_index]]) 118 print("\n") 119 else: 120 #print(type(correct_words[q_nums[q_nums_index]])) 121 #print(type(ans_words[q_nums_index])) 122 print("回答:"+str(correct_words[q_nums[q_nums_index]])) 123 print("入力した答え:"+str(ans_words[q_nums_index])) 124 print("\n"+str(q_nums_index+1)+":不正解") 125 print("答え:"+correct_words[q_nums[q_nums_index]]) 126 print("\n") 127 q_nums_index+=1 128 129print("\n")
####input_str.pyのOutput
__1__ __2__ an __3__ 回答を入力してください 1:I 2:have 3:apple ans_words:["['I']", "['have']", "['apple']"] correct_words['I', 'have', 'an', 'apple'] 回答:I 入力した答え:['I'] 1:不正解 答え:I 回答:have 入力した答え:['have'] 2:不正解 答え:have 回答:apple 入力した答え:['apple'] 3:不正解 答え:apple
試したこと
- ans_wordsに格納されている標準入力された文字列とcorrect_wordsに格納されている文字列の方が違うかもしれないと思ったので、回答入力部に ans_words.append(str(ans_word)) でキャストして同じ型にしていますが、変わりませんでした。
- シングルクォーテーションが足りないのかなと思い、シングルクォーてションを入れて同じように入力しましたが、結果は変わりませんでした。
I __1__ an apple 回答を入力してください 1:'have' ans_words:['["\'have\'"]'] correct_words['I', 'have', 'an', 'apple'] 回答:have 入力した答え:["'have'"] 1:不正解 答え:have
補足情報(FW/ツールのバージョンなど)
- Python 3
- VScode 1.60.1
Pythonは勉強し始めて1週間というところです。
CやJavaは1~2年くらい触れています。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。