0, 0, 0, 0, 0, 0, 0, 0] n_vals = [6,2] NLISTLEN = len(n_list) # 隙間の数を埋める処理 interval_len = len(n_vals) + 1 sum_range_num = int(NLISTLEN - sum(np.array(n_vals))) # 左右のどちらかが 「0」 になることを見越して処理量を減らすための処理 range_num = sum_range_num - interval_len + 3 interval = [list(b) for b in list(itertools.product(range(range_num+1), repeat = interval_len)) if sum(b) == sum_range_num and (0 not in b[1:-1] or len(b) <= 2)] ## interval = [0,1,1],[0,2,0],[1,1,0] patarn = np.zeros(NLISTLEN) for iv_val in interval: new_list = np.zeros(0) for w,n_value in enumerate(n_vals): new_list = np.append(new_list, np.zeros(int(iv_val[w]))) new_list = np.append(new_list, np.ones(int(n_value))) new_list = np.append(new_list, np.zeros(NLISTLEN - len(new_list))) patarn = patarn+new_list ## patarn = [2,3,3,3,3,3,1,1,3,2] bunkatsu = np.array([ 1 if val==len(interval) or n_list[nums[i]] == 1 else 0 for i,val in enumerate(patarn)]) ## interval = [0,1,1,1,1,1,0,0,1,0] = [□,▪,▪,▪,▪,▪,□,□,▪,□] bunkatsu = np.array([-1 if val==0 else bunkatsu[i] for i,val in enumerate(patarn)]) n_list[nums[0]:nums[-1]+1] = bunkatsu 「itertools」 を使ってみた 6,2 3つのパターンがある 全てのパターンで 塗られているマスは確定 pythonの内部処理 ・3つのパターンがある numpyで配列計算 全てのリストを加算 リストの数と一致した 箇所は塗り確定 [1, 1, 1, 1, 1, 1, 0, 1, 1, 0] [1, 1, 1, 1, 1, 1, 0, 0, 1, 1] [0, 1, 1, 1, 1, 1, 1, 0, 1, 1] [2, 3, 3, 3, 3, 3, 1, 1, 3, 2] [□,▪,▪,▪,▪,▪,□,□,▪,□]