数字の組み合わせを取得する

実現したいこと

Pythonで数字の組み合わせを取得するコードを作りたいのですが、うまくできず困っています

  • 1~20までの数字を5つのリストに分ける動作を6回行う

 (例)[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16], [17, 18, 19, 20]のように分ける

【条件】
①過去に同じリストに入ったことのある数字は同じリストに入れられない
例えば[1,2,3,4]のように入った場合は、1は以降の振り分けで2,3,4と同じリストには入れられない([1,2,5,6]などはNG)
②数字は毎回1~20まで使い切った組み合わせにする

該当のソースコード

import random import itertools # 6回の繰り返し saved_number = {} # 過去の組み合わせを保存 result_dict = {num: [] for num in range(1, 21)} # 数字ごとのリストが一緒になった数字を記録 numbers = list(range(1, 21)) # 1から20までの数字のリストを作成 for _ in range(6): # 6回行う sections = [[] for _ in range(5)] # 5つに分ける numbers = list(range(1, 21)) # 1から20までの数字のリストを作成 for num in numbers: # 数字の取り出し for num_list in sections: # 区画リスト saved_num = result_dict[num] # 過去に一緒になった数字 if any(element in num_list for element in saved_num) or len(num_list) > 3: # 過去に同じリストに入ったまたは区画が4個以上の場合は処理しない continue else: num_list.append(num) break saved_number[f"{_}回目"] = sections # 回数ごとの分け方を保存 # 各数字をキーにして、同じリスト内に出現した他の数字をリストにまとめる for key, value in saved_number.items(): for sublist in value: for num in sublist: if num not in result_dict: result_dict[num] = [] other_numbers = set(sublist) - {num} result_dict[num].extend(other_numbers) # 各回の結果を表示 print(f"回: {_ + 1}") for i, section in enumerate(sections, 1): print(f"区画{i}: {section}")

このコードだと、出力が
回: 1
区画1: [1, 2, 3, 4]
区画2: [5, 6, 7, 8]
区画3: [9, 10, 11, 12]
区画4: [13, 14, 15, 16]
区画5: [17, 18, 19, 20]
回: 2
区画1: [1, 5, 9, 13]
区画2: [2, 6, 10, 14]
区画3: [3, 7, 11, 15]
区画4: [4, 8, 12, 16]
区画5: [17]
回: 3
区画1: [1, 6, 11, 16]
区画2: [2, 5, 12, 15]
区画3: [3, 8, 9, 14]
区画4: [4, 7, 10, 13]
区画5: [17]
回: 4
区画1: [1, 7, 12, 14]
区画2: [2, 8, 11, 13]
区画3: [3, 5, 10, 16]
区画4: [4, 6, 9, 15]
区画5: [17]
回: 5
区画1: [1, 8, 10, 15]
区画2: [2, 7, 9, 16]
区画3: [3, 6, 12, 13]
区画4: [4, 5, 11, 14]
区画5: [17]
回: 6
区画1: [1, 17]
区画2: [2, 18]
区画3: [3, 19]
区画4: [4, 20]
区画5: [5]
となり二回目以降1~20を使い切れていない問題が発生しています。
最初のリストからどんどん埋めていっているので最後の数字になるにつれ入れる場所がなくなってしまっています・・・

試したこと

1~20のなかから4つ組み合わせを取ってくる方法(itertools)も試してみたのですがうまくいかず

コメントを投稿

0 コメント