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

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

新規登録して質問してみよう
ただいま回答率
85.48%
標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Python

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

1004閲覧

同じ文字列を比較しているのに同じ文字列だと判定されないので、同じ文字列だと判定できるようにしたい

Stella_Aqr

総合スコア0

標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Python

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/09/21 04:33

編集2021/09/22 01:45

前提・実現したいこと

英語の穴埋め問題を作っています。
「回答を入力してください」と表示された後に回答を問題番号ごとに入力するようにしていますが、入力した文字列と正解の文字列が同じでも同じ文字列として判定されないため、同じ文字列と判定されるようにしたいです。
テスト用として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

試したこと

  1. ans_wordsに格納されている標準入力された文字列とcorrect_wordsに格納されている文字列の方が違うかもしれないと思ったので、回答入力部に ans_words.append(str(ans_word)) でキャストして同じ型にしていますが、変わりませんでした。
  2. シングルクォーテーションが足りないのかなと思い、シングルクォーてションを入れて同じように入力しましたが、結果は変わりませんでした。
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年くらい触れています。

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

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

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

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

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

guest

回答2

0

自己解決

解答入力部の

ans_words.append(str(ans_word))

ans_words[len(ans_words):len(ans_words)] = ans_word

にすると、うまくいけました。

appendを使うと配列に結合ではなく、単に要素を追加するとなるそうです。
スライス機能を使って、開始インデックスと終了インデックスを末尾に指定することで結合の形を取ることができるようです。
結合するとうまくいきました。

投稿2021/09/22 02:18

Stella_Aqr

総合スコア0

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

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

0

python

1if str(correct_words[q_nums[q_nums_index]]) is str(ans_words[q_nums_index]):

python

1if str(correct_words[q_nums[q_nums_index]]) == str(ans_words[q_nums_index]):

に変更しましょう。

投稿2021/09/21 04:43

ppaul

総合スコア24666

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

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

Stella_Aqr

2021/09/21 15:30 編集

解答ありがとうございます。 直しました。 できればもう少し建設的な意見が欲しかったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問