Bu yazıda bir listenin kombinasyonlarını Python ile üretmeye bakalım. Örnek olsun diye listemiz küçük bir liste olsun:

liste = [1, 2, 3]

Listemizin tek elemanlı, çift elemanlı ve üç elemanlı kombinasyonlarını üretip bir listeye atalım.

combinations(iterable,r) fonksiyonu iterable diziliminin r elemanlı tüm alt-dizilimlerini döndürür.
from itertools import combinations

komb = []
for i in xrange(1, len(liste)+1):
    iBoyluKomb = [list(x) for x in combinations(liste, i)]
    komb.append([i, iBoyluKomb])

for k in komb:
    print k[0], k[1]

# 1 [[1], [2], [3]]
# 2 [[1, 2], [1, 3], [2, 3]]
# 3 [[1, 2, 3]]

İsterseniz boş kümeyi de ekleyebilirsiniz, ben eklemedim.

Not etmekte fayda var: İllâ da bir liste üstünde çalışmamıza gerek yok. Örneğin bir küme de olabilirdi. Yeter ki döngü kurulabilir (iterable) bir nesne olsun.

kume = set(['a', 'b', 'c', 'd'])
komb = []
for i in xrange(1, len(kume)+1):
    iBoyluKomb = [list(x) for x in combinations(kume, i)]
    komb.append([i, iBoyluKomb])

for k in komb:
    print k[0], k[1]

# 1 [['a'], ['c'], ['b'], ['d']]
# 2 [['a', 'c'], ['a', 'b'], ['a', 'd'], ['c', 'b'], ['c', 'd'], ['b', 'd']]
# 3 [['a', 'c', 'b'], ['a', 'c', 'd'], ['a', 'b', 'd'], ['c', 'b', 'd']]
# 4 [['a', 'c', 'b', 'd']]

Peki, eleman sayılarını istemeseydik nasıl yapacaktık? Yani, sadece kombinasyonları isteseydik? Kodu sadeleştirelim:

Burada extend kullandığımıza dikkat edin. extend fonksiyonu append'den farklı olarak listenin sonuna ikinci parametredeki elemanı/listeyi eklemez, ilk listeyi ikincinin önüne bağlar. Örnek için tıklayınız.
for i in xrange(1, len(liste)+1):
    iBoyluKomb = [list(x) for x in combinations(liste, i)]
    komb.extend(iBoyluKomb)

for k in komb:
    print k,

# [1] [2] [3] [1, 2] [1, 3] [2, 3] [1, 2, 3]

Not: Bu yazıda şu kaynaktan oldukça yararlandım.