組み合わせを列挙するイテレータ
Python 2.6以降はitertools.combinationsで同様のことができます。以下の記述はPython 2.3〜2.5向けです。
リストからn個取り出したものを返していく。
def gen_comb(L,n): if n == 0: yield [] else: for i,x in enumerate(L): for L1 in gen_comb(L[i+1:],n-1): yield [x]+L1 for c in gen_comb(range(5),3): print c
[0, 1, 2] [0, 1, 3] [0, 1, 4] [0, 2, 3] [0, 2, 4] [0, 3, 4] [1, 2, 3] [1, 2, 4] [1, 3, 4] [2, 3, 4]
リストの代わりに集合を使った場合。
def gen_combset(S,n): if n == 0: yield set() else: while S: x = S.pop() for S1 in gen_combset(S.copy(),n-1): S1.add(x) yield S1 for c in gen_combset(set(range(5)), 3): print c
set([0, 1, 2]) set([0, 1, 3]) set([0, 1, 4]) set([0, 2, 3]) set([0, 2, 4]) set([0, 3, 4]) set([1, 2, 3]) set([1, 2, 4]) set([1, 3, 4]) set([2, 3, 4])