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 の要素にアクセス

なんかもできる。