組み合わせを列挙するイテレータ

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])