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

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

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

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

Q&A

解決済

1回答

1119閲覧

random.sampleを使っているのに要素が重複する

退会済みユーザー

退会済みユーザー

総合スコア0

Python

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

0グッド

0クリップ

投稿2020/01/20 13:25

編集2020/01/20 14:05

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

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

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

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

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

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

otn

2020/01/20 13:52

質問文が異様に見にくいと思いませんか?
hayataka2049

2020/01/20 13:52

質問を編集し、コードを ```python コード ``` のようにmarkdownでくくるようにしてください。現状だと不格好だしインデントが潰れます。
guest

回答1

0

ベストアンサー

4個から3個を重複なしで抽出する

Python

1import random 2 3samples = ['A', 'B', 'C', 'D'] 4print(random.sample(samples, 3)) 5#['D', 'B', 'C']

【NG例】
4個から1個を抽出 × 3回 ⇒ 重複することもしないこともある

Python

1import random 2samples = ['A', 'B', 'C', 'D'] 3print(random.sample(samples, 1), random.sample(samples, 1), random.sample(samples, 1)) 4#['B', 'D', 'B'] 5

投稿2020/01/20 13:43

meg_

総合スコア10580

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

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

退会済みユーザー

退会済みユーザー

2020/01/20 13:49

ありがとうございます。 しかしこのプログラムで rdo_txt = [random.sample(b_options , k=4)] としてしまうと、4つの要素が1行で表示され、ラジオボタンが1つになってしまいます。 重複せず、並びもランダムに、4つの選択肢として表示するにはどうすればよいでしょうか。
meg_

2020/01/20 13:54

一旦リストに格納してから、1個ずつ取り出せば良いと思います。 私のコードの例) temp = random.sample(samples, 3) for i in temp: print(i) #D #B #C
hayataka2049

2020/01/20 14:14

そもそもリスト型で返るのだから rdo_txt = random.sample(b_options , k=4) でいいし、あるいは単にrandom.shuffleを使うことも検討してください。 (回答するほどでもないのでmeg_さんのコメント欄をお借りして書かせていただきました)
退会済みユーザー

退会済みユーザー

2020/01/20 14:25

なるほど。ラジオボタン周りについて調べ始めたところで、rdo_txtの使い方を十分に理解できていませんでした。希望する動きが実現できました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問