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

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

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

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

460閲覧

英語の大文字・小文字をそのまま取得したい【英単語テスト作成】

shooootmt

総合スコア15

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/01/23 08:19

英単語テストを作成中

以下のようにコードを書きました。このままでは小文字しかリストから抜け出せず、問3の本来「December」としたい所が謎の単語を生成してしまっています。なにか解決の手立てをいただければ幸いです。

またおそらく文字が綺麗に抜き出せていない関係で(?)、正答もずれてしまっています。
お力添えいただけないでしょうか。よろしくお願いします。

python3

1import re 2import random 3 4source = 'english_words.txt' 5with open(source) as f: 6 date = f.read() 7 8english_words = re.findall('[a-z]+',date) 9ja = re.findall('\s.*\n',date) 10 11meanings = [] 12for word in ja: 13 m = re.sub('\t|\n','',word) 14 meanings.append(m) 15 16words_dict = dict(zip(english_words,meanings)) 17 18n_tests = 1 19n_questions = 50 20 21for test_num in range(n_tests): 22 with open('英単語テスト_{:02d}.txt'.format(test_num+1),'w') as f: 23 24 f.write('出席番号:\n' 25 '名前:\n\n' 26 '第{}回 英単語テスト\n\n'.format(test_num+1)) 27 28 for question_num in range(n_questions): 29 question_word = random.choice(english_words) 30 correct_answer = words_dict[question_word] 31 32 meanings_copy = meanings.copy() 33 meanings_copy.remove(correct_answer) 34 wrong_answers = random.sample(meanings_copy,3) 35 36 answer_options = [correct_answer] + wrong_answers 37 random.shuffle(answer_options) 38 39 f.write('問{}.{}\n'.format(question_num+1,question_word)) 40 41 for i in range(4): 42 f.write('{}. {}\n'.format(i+1,answer_options[i])) 43 44 f.write('\n\n')
結果 出席番号: 名前: 第1回 英単語テスト 問1.get 1. 到着する 2. 待つ 3. 3月 4. 少女 問2.weather 1. 私たちは 2. 9 3. 50 4. 道,方法 問3.ecember 1. 12月 2. 去る,残す,置いて行く 3. 春 4. 右,権利 問4.nobody 1. それ自身 2. だれも~ない 3. ~もまた,~すぎる 4. 雨 ・・・以下50問まで続く

試した事

lower()を使いたいのですが、名詞等どうしても大文字のままにしておきたい単語もあるので、使えません。

補足

python3.6.6
Jupiter notebook

words_dictはこんな感じになります。 print(words_dict) {'a': '1つの', 'able': 'できる,有能な', 'afternoon': '午後', 'again': '再び', 'age': '年齢,時代', 'ago': '前', 'all': 'すべての', 'already': 'すでに', 'also': 'もまた', 'always': 'いつも', 'merica': 'アメリカ合衆国', 'an': '1つの', 'and': '~と、そして', 'angry': '怒った', 'animal': '動物', 'apple': 'りんご', 'pril': '4月', 'arrive': '到着する', 'at': '~に', 'ugust': '8月', 'aunt': 'おば', 'ustralia': 'オーストラリア', 'autumn': '秋', 'bad': '悪い', 'bag': 'カバン', 'ball': 'ボール', 'bank': ' 土手', 'baseball': '野球', 'basketball': 'バスケットボール', 'bat': 'バット', 'beautiful': '美しい', 'bed': 'ベッド', 'best': '一番良い', 'big': '大きい', 'bike': '自転車', 'bird': '鳥', 'birthday': '誕生日', 'black': '黒い', 'blue': '青い', 'boat': 'ボート', 'book': '本', 'both': '両方', 'box': '箱', 'boy': '少年', 'bread': 'パン', 'breakfast': '朝食', 'brother': '兄弟', 'bus': 'バス', 'busy': '忙しい', 'but': 'しかし', 'buy': '買う', 'by': '~のそばに、~よって', 'cake': 'ケーキ', 'camera': 'カメラ', 'can': '~できる、してもよい', 'anada': 'カナダ', ・・・と続いていきます。

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

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

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

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

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

LouiS0616

2019/01/23 11:23

english_words.txtの内容は公開できますか? そもそも正規表現は不要なんじゃ無いかという気がしています。
shooootmt

2019/01/23 13:39

コメントいただきありがとうございます。 以下のような感じでただ羅列してあるだけです。 a 1つの able できる,有能な afternoon 午後 again 再び age 年齢,時代 ago 前 all すべての already すでに ・・・ 元々他の教科のものを作りたく、csvにも挑戦したのですがうまくいきませんでした。正規表現がいらない手法をぜひ教えていただければと思います。よろしくお願いします。
guest

回答2

0

ベストアンサー

以下のような感じでただ羅列してあるだけです。

...

空白で分割すれば充分なように思えます。

Python

1words_dict = {} 2 3with open('english_words.txt') as fin: 4 for line in map(str.rstrip, fin): # 不要な改行文字を除去しながら読み込み 5 eng, *jps = line.split() # 空白で分割、最初の要素をengに、余った要素をjpsに放り込む 6 # print(type(jps), jps) 7 words_dict[eng] = ''.join(jps) # jpsの要素を連結し、辞書に放り込む 8 9print(words_dict)

実行結果 Wandbox

{'a': '1つの', 'able': 'できる,有能な', 'afternoon': '午後', 'again': '再び', 'age': '年齢,時代', 'ago': '前', 'all': 'すべての', 'already': 'すでに'}

余談

元々他の教科のものを作りたく、csvにも挑戦したのですがうまくいきませんでした。

ご提示のenglish_words.txtは、英単語とその意味をタブ文字で分割していますよね。
実はこれ、デリミタに\tを選んだ立派なCSVの一種(TSV)だったりします。

類似したフォーマットとして、タブで区切られた tab-separated values (TSV)や、欧文間隔 (いわゆる半角スペース) で区切られた space-separated values (SSV) などがあり、これらをまとめて character-separated values (CSV)、delimiter-separated values (DSV) とも呼ばれることも多い。

引用元: Wikipedia - Comma-Separated Values

csvモジュールを利用して読み込むとこんな感じです。

Python

1import csv 2 3 4words_dict = {} 5 6with open('english_words.tsv', newline='') as fin: 7 reader = csv.reader(fin, delimiter='\t') 8 for eng, jp in reader: 9 words_dict[eng] = jp 10 11print(words_dict)

実行結果 Wandbox

{'a': '1つの', 'able': 'できる,有能な', 'afternoon': '午後', 'again': '再び', 'age': '年齢,時代', 'ago': '前', 'all': 'すべての', 'already': 'すでに'}

こっちの方が簡潔かと問われれば、ちょっと微妙な線ではありますが。

投稿2019/01/23 13:54

編集2019/01/23 14:32
LouiS0616

総合スコア35660

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

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

shooootmt

2019/01/23 14:10

実際に動かしてみました。こちらの方が見た目もスッキリで汎用性もあって良いように思います。ありがとうございます! また重ねて質問なのですが、jpsの前の*はどういった働きになりますか。
LouiS0616

2019/01/23 14:14

> jpsの前の*はどういった働きになりますか。 このコードについては、次のように書くのと同じです。 blocks = line.split() eng = blocks[0] jps = blocks[1:]
LouiS0616

2019/01/23 14:16

*a, b, c = [1, 2, 3, 4, 5] print(a, b, c) # [1, 2, 3] 4 5 a, *b, c = [1, 2, 3, 4, 5] print(a, b, c) # 1 [2, 3, 4] 5 a, b, *c = [1, 2, 3, 4, 5] print(a, b, c) # 1 2 [3, 4, 5]
shooootmt

2019/01/23 14:34

ご丁寧な回答、大変ありがたく思います。また、わかりやすい例までご教示いただき何といったらいいか。理解できました!これからも勉強に励みたいと思います!
LouiS0616

2019/01/23 14:50

よく考えたら、もうちょっとシンプルに書けそうなことに気付きました。 eng, jp = line.split('\t') words_dict[eng] = jp タブ区切りですものね。
guest

0

詳しくソース呼んでいないのですが

Python

1english_words = re.findall('[a-zA-Z]+',date)

に変更してもだめですか?

投稿2019/01/23 08:25

yamato_user

総合スコア2321

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

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

shooootmt

2019/01/23 08:29

ご返答いただきありがとうございます。試してみた所できました! ですが出題と回答がずれているという点はまだ治っていなかったので、そっちの原因も探してみようと思います。
shooootmt

2019/01/23 08:39

「do didの過去形」という設問があり、ここがfindall('[a-zA-Z]')に抜き出されてしまっていたので、最後に並び替える事でどうにか回避しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問