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

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

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

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

Q&A

解決済

1回答

1228閲覧

ランダムな問題集ファイル作成について

jun09

総合スコア8

Python

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

0グッド

0クリップ

投稿2018/04/06 00:04

前提・実現したいこと

pythonでランダムな問題集ファイルを作成しており、以下のようにコードを書いたのですが、問題集35のみに問が出るだけで、そのほかの問題集134には問がのっていない状況です。そして、35も本来なら147までの問が出るように書いているつもりですが、問が47しか出ていません。この状況を改善し、35通りの問題で、47問の4択問題を作成したいので、改善すべき点を教えて欲しいです。

発生している問題・エラーメッセージ

import random

capitals = {'北海道':'札幌',
'青森':'青森','岩手':'盛岡','宮城':'仙台','秋田':'秋田','山形':'山形','福島':'福島',
'茨城':'水戸','栃木':'宇都宮','群馬':'前橋','埼玉':'さいたま','千葉':'千葉','東京':'東京','神奈川':'横浜',
'新潟':'新潟','富山':'富山','石川':'金沢','福井':'福井',
'山梨':'甲府','長野':'長野','岐阜':'岐阜','静岡':'静岡','愛知':'名古屋',
'三重':'津','滋賀':'大津','京都':'京都','大阪':'大阪','兵庫':'神戸','奈良':'奈良','和歌山':'和歌山',
'鳥取':'鳥取','島根':'松江','岡山':'岡山','広島':'広島','山口':'山口',
'徳島':'徳島','香川':'高松','愛媛':'松山','高知':'高知',
'福岡':'福岡','佐賀':'佐賀','長崎':'長崎','熊本':'熊本','大分':'大分','宮崎':'宮崎','鹿児島':'鹿児島',
'沖縄':'那覇'}

for quiz_num in range(35):
quiz_file = open('capitalsquiz{}.txt'.format(quiz_num + 1),'w')
answer_key_file = open('capitalsquiz_answers{}.txt'.format(quiz_num + 1),'w')

quiz_file.write('名前:\n\n日付:\n\n学期:\n\n') quiz_file.write((' '*20) + '都道府県所在地クイズ(問題番号{})'.format(quiz_num + 1)) quiz_file.write('\n\n') prefectures = list(capitals.keys()) random.shuffle(prefectures)

for question_num in range(len(prefectures)):

correct_answer = capitals[prefectures[question_num]] wrong_answers = list(capitals.values()) del wrong_answers[wrong_answers.index(correct_answer)] wrong_answers = random.sample(wrong_answers,3) answer_options = wrong_answers + [correct_answer] random.shuffle(answer_options)

quiz_file.write('{}.{}の都道府県庁所在地は?\n'.format(question_num + 1,prefectures[question_num]))
for i in range(4):
quiz_file.write('{},{}\n'.format('ABCD'[i],answer_options[i]))

quiz_file.write('\n')

answer_key_file.write('{}.{}\n'.format(question_num + 1,'ABCD'[answer_options.index(correct_answer)]))

quiz_file.close()
answer_key_file.close()

#作成されたファイル
名前:

日付:

学期:

都道府県所在地クイズ(問題番号35)

47.宮城の都道府県庁所在地は?
A,青森
B,仙台
C,水戸
D,富山

エラーメッセージ

該当のソースコード

ソースコード

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

hayataka2049

2018/04/06 00:09

とりあえずマークダウンを使ってインデントが反映されるようにしてほしいのと、どういう要件のプログラムなのかちゃんと説明してください。何がしたいのかよくわかりません
dit.

2018/04/06 00:29 編集

hayataka2049さんも書いていますが、teratailにはコードを見やすくするためのしくみがあります。質問を編集状態にして、コード部分を選択して、<code>ボタンを押してください。こちらも参考にhttps://teratail.com/help/question-tips#questionTips3-5 (読みやすくする仕組みと書きましたがpythonはインデントが重要な言語だったと認識しています。そのまま記述するとインデントがなくなるので「必ず」コードブロックにしてください)
guest

回答1

0

ベストアンサー

とりあえずプログラムを手元環境にコピーして、適当にインデントしたらなぜか正しい(であろう)動作になってしまいました・・・。

python

1import random 2 3capitals = {'北海道':'札幌', 4'青森':'青森','岩手':'盛岡','宮城':'仙台','秋田':'秋田','山形':'山形','福島':'福島', 5'茨城':'水戸','栃木':'宇都宮','群馬':'前橋','埼玉':'さいたま','千葉':'千葉','東京':'東京','神奈川':'横浜', 6'新潟':'新潟','富山':'富山','石川':'金沢','福井':'福井', 7'山梨':'甲府','長野':'長野','岐阜':'岐阜','静岡':'静岡','愛知':'名古屋', 8'三重':'津','滋賀':'大津','京都':'京都','大阪':'大阪','兵庫':'神戸','奈良':'奈良','和歌山':'和歌山', 9'鳥取':'鳥取','島根':'松江','岡山':'岡山','広島':'広島','山口':'山口', 10'徳島':'徳島','香川':'高松','愛媛':'松山','高知':'高知', 11'福岡':'福岡','佐賀':'佐賀','長崎':'長崎','熊本':'熊本','大分':'大分','宮崎':'宮崎','鹿児島':'鹿児島', 12'沖縄':'那覇'} 13 14for quiz_num in range(35): 15 quiz_file = open('capitalsquiz{}.txt'.format(quiz_num + 1),'w') 16 answer_key_file = open('capitalsquiz_answers{}.txt'.format(quiz_num + 1),'w') 17 18 quiz_file.write('名前:\n\n日付:\n\n学期:\n\n') 19 quiz_file.write((' '*20) + '都道府県所在地クイズ(問題番号{})'.format(quiz_num + 1)) 20 quiz_file.write('\n\n') 21 22 prefectures = list(capitals.keys()) 23 random.shuffle(prefectures) 24 25 for question_num in range(len(prefectures)): 26 27 correct_answer = capitals[prefectures[question_num]] 28 wrong_answers = list(capitals.values()) 29 del wrong_answers[wrong_answers.index(correct_answer)] 30 wrong_answers = random.sample(wrong_answers,3) 31 answer_options = wrong_answers + [correct_answer] 32 random.shuffle(answer_options) 33 34 quiz_file.write('{}.{}の都道府県庁所在地は?\n'.format(question_num + 1,prefectures[question_num])) 35 for i in range(4): 36 quiz_file.write('{},{}\n'.format('ABCD'[i],answer_options[i])) 37 38 quiz_file.write('\n') 39 40 answer_key_file.write('{}.{}\n'.format(question_num + 1,'ABCD'[answer_options.index(correct_answer)])) 41 42 quiz_file.close() 43 answer_key_file.close()
  • capitalsquiz*.txtとcapitalsquiz_answers*.txt(*は1~35)ができる
  • ファイル内容はおそらく要件通り(詳しくチェックしていないので保証はできませんが)

ちょっとインデントを見直してみてください。

重要:このコードをコピペして上手くいきました、で解決済みにするのではなく、まずは質問投稿時のコードをそのままのインデントで掲載した上で何らかのアクションを取ってください。

投稿2018/04/06 00:19

編集2018/04/06 01:06
hayataka2049

総合スコア30933

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

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

ikapy

2018/04/06 00:51

すみません。ダロカンとなんでしょうか。「python ダロカン」でググってもそれらしきものは出なかったもので。便利そうなので、私も使ってみたいです。
hayataka2049

2018/04/06 00:53

すみません、一般的な単語として使っていたのですが、あまり認知されていないようでした。「これくらいダロうというカンどころ」です。 http://toolate.sblo.jp/article/177675272.html 「python ダロカン」で検索して出てくるのはすべて私のブログです・・・。
ikapy

2018/04/06 01:00

納得しました。てっきりツール類かと思ったもので。 ありがとうございました。
hayataka2049

2018/04/06 01:11

使ったツールはemacsとflymakeだけです。「とりあえず動かさないことには」ってインデントしてみたら、あれれ、と 「ダロカン」は「適当に」に書き換えておきました。つまらないことで混乱を招いて申し訳ないです
jun09

2018/04/11 23:24

解答ありがとうございます。字下げが元のファイルではうまくいっていないようでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問