python3でクイズプログラムを作成しようとしています。
1.問題に使う植物Aをランダムに選択
2.Aと同じ科の植物の中から別のひとつBを選択(答えとなる)
3.Aと異なる科の植物の中から3つを選択(C,D,E)
4.「Aと同じ科の植物はどれか選べ」という問題に
B,C,D,Eの選択肢を提示する
というプログラムを想定しています。
上記4.の部分について、選択肢4つを格納したb_optionsに対して
random.sampleを使用しているのですが、なぜかひとつが重複してしまいます。
(4つの値のうち、3種類、うちひとつが2回表示される)
きちんと4つ出すために、何が間違っているのか教えていただけないでしょうか。
該当のソースコード
python3.8.0
1 2import random 3import csv 4import tkinter, tkinter.messagebox 5 6# 問題のもととなるcsvファイルを読み込み 7# csvは1行目に name,family,character 8# 2行目に カブ,アブラナ科,春の七草 9# 3行目以降 キキョウ,キキョウ科,秋の七草 10# といった感じで3列の値が並ぶ 11 12with open('plant.csv', newline='') as csvfile: 13 reader = csv.DictReader(csvfile) 14 rows = [] 15 for row in reader: 16 rows.append(row) 17 18# 上記DictReaderで読み込んだ辞書リストから、問題用に、ひとつの辞書を呼び出す 19p_plant = random.choice(rows) 20p_name = p_plant["name"] 21 22# 問題用の植物と同じ科(family)の植物をリストにして、 23# その中から問題用の植物を削除。 24# 残りからひとつを選ぶ(=その植物が答えになる) 25 26q_list = [x['name'] for x in rows if x['family'] == p_plant["family"]] 27q_list.remove(p_plant["name"]) 28answer = random.choice(q_list) 29 30# 答えとは異なる科(family)の植物をリスト化し、そこから3つ選ぶ 31 32b_list = [x['name'] for x in rows if x['family'] != p_plant["family"]] 33b_options = random.sample(b_list , 3) 34b_options.append(str(answer)) 35 36tki = tkinter.Tk() 37tki.geometry('300x400') 38tki.title('ラジオボタン') 39 40# ラジオボタンのラベルをリスト化する 41# はずなんですが、ここがうまくいっていません・・ 42rdo_txt = [random.sample(b_options , k=1) , random.sample(b_options , k=1) , random.sample(b_options , k=1) ,random.sample(b_options , k=1)] 43# ラジオボタンの状態 44rdo_var = tkinter.IntVar() 45 46# ラジオボタンを動的に作成して配置 47for i in range(len(rdo_txt)): 48 rdo = tkinter.Radiobutton(tki, value=i, variable=rdo_var, text=rdo_txt[i]) 49 rdo.place(x=50, y=30 + (i * 24)) 50 51# ボタンクリックイベント 52def btn_click(): 53 num = rdo_var.get() 54 55 if rdo_txt[num] == str(answer): 56 tkinter.messagebox.showinfo('結果' , "正解!") 57 else: 58 tkinter.messagebox.showinfo("結果" , '不正解!正解は' + answer) 59 60# ボタン作成 61btn = tkinter.Button(tki, text='答え合わせ', command=btn_click) 62btn.place(x=100, y=170) 63 64var = tkinter.StringVar() 65var.set(p_name + "と同じ科の植物はどれでしょう") 66label = tkinter.Label(tki, textvariable=var, width=100, ) 67label.pack() 68label.bind("<ButtonPress-1>", update_label) 69 70tki.mainloop() 71
回答1件
あなたの回答
tips
プレビュー