組み合わせを検討して関数を実行していくときに、if 文の条件を複数書くのが面倒くさい。
単純にフラグが立ったものを実行するのにいい方法はないのかと文法を色々見てみたけれど、書き方が好みのものがありませんでした。
仕方がないので、あんまりいい感じではないのでしょうが書いてみました。
def a(): print("a",end="") def b(): print("b",end="") def c(): print("c",end="") k=["a()","b()","c()"] for i in range(1<<len(k)): for s,t in zip(format(i,f"0{len(k)}b"),k): if s=="1": exec(t) print("")
こんな感じの jupyter notebook で探すときだけに使う書き捨て用です。
フラグを立てることのみを考えて、
format(i,f"0{len(k)}b") # もしくは f"{i:0{len(k)}b}"
にすることで、i が len(k) 桁 = 準備した関数の数のフラグに対応した桁数 の文字列の2進数表記になるため、特定の範囲で数指定の対応*1がスライス切って計算するだけなので、非常に楽になります。
範囲指定だけですが、下に書いてみました。
最初の範囲、次の範囲が v0 , v1 、最初の範囲で lim0 個、次の範囲で lim1 個以上当てはめて計算したいという想定で、
v0=3 v1=5 lim0=1 lim1=3 total=v0+v1 for f in range(1<<v1,1<<total): f2=[int(b) for b in format(f,f'0{total}b')] if sum(f2[:v0])>=lim0 and sum(f2[-v1:])>=lim1: print(f,f2)
こんな感じです。
*1:全部で15個の関数のうち、最初の8個から4個以上、残りから2個以上の組み合わせが欲しい、なんてケース