前提・実現したいこと
python3において
以下の条件を満たすようなリストを作成したいです.
・リスト内の要素の総和がn
・ある要素の和が与えられた条件を満たしている
・条件は要素の和が与えられる.与えられないものは基準値以下
作成するリストの長さが大きく,リストの要素の総和が大きいとき場合時間がかかってしまう(当たり前ですが...)
効率良く条件に合うリストを作り出すことはできないでしょうか?
現在は,リストの候補(総和n,リストの長さl_lenのリスト)をすべて計算し,その中から条件に合うものを結果として出力しています.
該当のソースコード
python
1from itertools import combinations_with_replacement 2n=20 #リストの要素の総和 3l_len = 5 #作成するリストの長さ 4lvalue = 2 #基準値 5check_dict = {frozenset([1,2,3]) : 12 , frozenset([0,2,4]) : 12 , frozenset([0,1]) : -1} #key:リストの要素のindex , value:keyが示すリストの要素の和(-1の場合基準値以下ならOK) 6result = [] #条件に合ったリストを格納するリスト 7#リストの要素の総和がn,作成するリストの長さがl_lenのリストの総組み合わせ 8for x in combinations_with_replacement(range(n+1), l_len-1): 9 t = [ed - st for st, ed in zip((0,) + x, x + (n,))] 10 #リストのチェック 11 for k,v in check_dict.items(): 12 s = 0 13 for index in k: 14 s += t[index] 15 if v == -1 and s > lvalue: 16 break 17 if v != -1 and s != v: 18 break 19 else: 20 result.append(t) 21result
今回の出力
[[0, 0, 4, 8, 8],
[0, 1, 4, 7, 8],
[0, 2, 4, 6, 8],
[1, 0, 4, 8, 7],
[1, 1, 4, 7, 7],
[2, 0, 4, 8, 6]]
回答1件
あなたの回答
tips
プレビュー