前提・実現したいこと
席の希望が反映されるような席替えのシステムを作っています。
席番号ごとにその席を希望する人(出席番号1〜6)のリストを用意しました。
その中から座る人をランダムで選んだ席番号順のリストを作り、更に重複がない場合だけ表示されるようにしたいです。(複数の席に同じ出席番号が割り当たらないようにしたい)
発生している問題・エラーメッセージ
実行してみると表示されたリストに普通に重複が含まれており、何回実行しても重複のないリストが得られません。
Python
1import random 2 3seat_1 = [1,2,4,5,6] 4seat_2 = [1,2,3,4,5,6] 5seat_3 = [1,2,5,6] 6seat_4 = [1,2,3] 7seat_5 = [1,3,4,5,6] 8seat_6 = [6] 9 10 11seats = [seat_1,seat_2,seat_3,seat_4,seat_5, 12 seat_6] 13 14 15 16#ランダムに座る人を選ぶ関数を定義 17def classroom(): 18 result = [] 19 for num in range(0,6): 20 random.choice(seats[num]) 21 result.append(random.choice(seats[num])) 22 return result 23 24 25#重複がない場合にTrue になる関数を定義 26def no_duplicates(seq): 27 return len(seq) == len(set(seq)) 28 29#重複がない場合だけリストを表示 30for i in range(100): 31 classroom() 32 if no_duplicates(classroom()) == True: 33 print(classroom())
試したこと
文字数len()と文字の種類数len(set())も表示させてみると2点問題がありました。
①文字の種類数が正しくない(正しい時もある)
②文字数と文字の種類数が一致していないのに「重複が無い」(no_duplicates()がTrue)と判断されている
本当に初心者なので、質問以外にもおかしな点などありましたら教えて頂けるとありがたいです。よろしくお願いします。
追記
can110さんのコードを使って下のように変更しました。
Python
1import random 2 3seat_1 = [2,3,4,5,6,7,8,12,13,15,19,22,30,31] 4seat_2 = [2,3,4,5,6,7,8,13,15,16,19,20,22,25,26,30,31,36] 5seat_3 = [2,4,6,7,8,14,15,16,20,25,26,30,33,36,37] 6seat_4 = [1,2,4,6,7,8,14,15,16,17,20,23,25,26,28,30,33,36,37] 7seat_5 = [1,2,4,6,7,8,14,16,17,20,23,25,26,28,30,33,36,37] 8seat_6 = [29] 9seat_7 = [2,3,6,7,8,10,15,16,19,22,25,30,31,36] 10seat_8 = [2,6,7,8,10,14,15,16,25,30,33,36,37] 11seat_9 = [1,2,6,7,8,10,14,15,16,17,23,25,28,30,33,36,37] 12seat_10 = [1,2,6,7,8,14,16,17,23,25,28,30,32,33,36,37] 13seat_11 = [1,2,4,6,7,8,14,16,17,18,23,28,30,32,33,34,37] 14seat_12 = [5,6,7,8,12,13,22,30,31] 15seat_13 = [5,6,7,8,13,22,30,31] 16seat_14 = [6,7,8,10,16,22,30,31] 17seat_15 = [6,7,8,10,14,16,21,30,33,37] 18seat_16 = [1,6,7,8,10,14,16,17,21,23,28,30,33,37] 19seat_17 = [1,6,7,8,14,16,17,21,23,28,30,33,37] 20seat_18 = [1,4,6,7,8,14,16,17,18,23,28,30,32,33,34,37] 21seat_19 = [5,6,7,8,12,13,22,30] 22seat_20 = [5,6,7,8,13,22,24,30] 23seat_21 = [6,7,8,10,16,22,24,30] 24seat_22 = [6,7,8,10,14,16,21,30,33,37] 25seat_23 = [1,6,7,8,10,14,16,17,21,23,28,30,33,37] 26seat_24 = [1,6,7,8,14,16,17,21,23,28,30,33,37] 27seat_25 = [1,4,6,7,8,14,16,17,18,23,28,30,32,33,34,37] 28seat_26 = [5,6,7,8,12,13,22,30] 29seat_27 = [5,6,7,8,13,22,24,30] 30seat_28 = [6,7,8,10,16,22,24,30] 31seat_29 = [6,7,8,10,14,16,24,30,33,37] 32seat_30 = [1,6,7,8,10,14,16,17,23,28,30,33,37] 33seat_31 = [1,6,7,8,14,16,17,23,28,30,33,37] 34seat_32 = [1,4,6,7,8,14,16,17,18,23,28,30,32,33,34,37] 35seat_33 = [4,5,6,7,8,13,22,24,27,30] 36seat_34 = [27] 37seat_35 = [11] 38seat_36 = [9] 39seat_37 = [35] 40 41 42seats = [seat_1,seat_2,seat_3,seat_4,seat_5, 43 seat_6,seat_7,seat_8,seat_9,seat_10, 44 seat_11,seat_12,seat_13,seat_14,seat_15, 45 seat_16,seat_17,seat_18,seat_19,seat_20, 46 seat_21,seat_22,seat_23,seat_24,seat_25, 47 seat_26,seat_27,seat_28,seat_29,seat_30, 48 seat_31,seat_32,seat_33,seat_34,seat_35, 49 seat_36,seat_37] 50 51# (席番号, 候補リスト)に整形 52seats = [(i+1,v) for i,v in enumerate(seats)] 53 54ret = [] 55while seats: 56 # 候補の少ない席から抽選する 57 i = seats.index(min(seats, key=lambda v:len(v[1]))) 58 seat = seats.pop(i) # popによって今から抽選する席番号は取り除かれる 59 60 # 抽選 61 person = random.choice(seat[1]) # 当選した人番号 62 63 # 結果を保存 64 ret.append((seat[0], person)) # (席番号, 人番号) 65 66 # 各席から当選した人を取り除く 67 seats = [ (seat[0], [p for p in seat[1] if p != person]) for seat in seats] 68 69ret.sort(key=lambda v:v[0]) # 結果を席番号順に 70print(ret)
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/27 09:46
2021/02/27 11:17
2021/02/27 12:11
2021/02/27 13:13
2021/02/28 05:32