Python ile bir listenin tüm kombinasyonlarını üretme
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.