pythonで直積、順列、組み合わせ
標準ライブラリのitertoolsモジュールにありました。
但し、python2.6から。
>>> list(itertools.product('ABC', 'abc')) # 直積 [('A', 'a'), ('A', 'b'), ('A', 'c'), ('B', 'a'), ('B', 'b'), ('B', 'c'), ('C', 'a'), ('C', 'b'), ('C', 'c')] >>> list(itertools.product('ABC', repeat=2)) # repeatは'ABC'の繰り返し数 [('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'B'), ('B', 'C'), ('C', 'A'), ('C', 'B'), ('C', 'C')] >>> list(itertools.permutations(range(3))) # 順列 [(0, 1, 2), (0, 2, 1), (1, 0, 2), (1, 2, 0), (2, 0, 1), (2, 1, 0)] >>> list(itertools.permutations([0,0,1])) # 要素の値の重複は気にしない [(0, 0, 1), (0, 1, 0), (0, 0, 1), (0, 1, 0), (1, 0, 0), (1, 0, 0)] >>> list(itertools.permutations(range(3), 2)) # 2要素取り出す [(0, 1), (0, 2), (1, 0), (1, 2), (2, 0), (2, 1)] >>> list(itertools.combinations(range(3), 2)) # 3つから二つ取り出す組み合わせ [(0, 1), (0, 2), (1, 2)]
調べればあるもんだなあ。特に多重ループを簡単にiteratorで置き換えられるのは便利。
つまり、
>>> for x in range(3): ... for y in range(3):
は
for x,y in itertools.product(range(3), repeat=2):
に置き換えられる。こっちのほうがコードがすっきりする。
応用として、
for x,y in itertools.permutation(range(3), 2): # 行列の非対角要素にアクセス for x,y in itertools.combination(range(3), 2): # x < y の要素にアクセス
なんかもできる。