2015-11-17 67 views
0

這可能很簡單,但我對這種編程方法很陌生,並且很難將我的頭圍繞在我需要做的事情上。從一個數組中生成一個排列列表

我試圖建立一個應用於圖像的過濾器列表。我可以應用七個過濾器,每個過濾器可以是01(打開或關閉)。該過濾器是:

filters = [ 
    'Exposure', 
    'Noise', 
    'Pressure', 
    'XQ Mix', 
    'Invert', 
    'Desaturate', 
    'Equalise' 
] 

我想產生是在他們的國家,這些過濾器的每一種可能的排列。應該有128個可能的排列(2^7),但是當我運行下面的代碼,我得到5080個排列:

perms = permutations(filters) 
perm_count = 0 
for p in perms: 
    print(p) 
    perm_count = perm_count + 1 

print str(perm_count) + ' total permutations' 
我可能使用了錯誤的方法

- 這一切正在做的是洗牌的過濾器的順序,我不在乎。

我試着更新過濾器列表,使每個過濾器有兩個項目,例如。 ['Exposure0', 'Exposure1']等,但運行combinations(filters, 7)針對此給我重複的值(例如,在同一個列表中的開啓和關閉狀態)。

我在這裏掙扎 - 任何人都可以給我一個正確的方向來推動這樣的事情嗎?看看文檔,像product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dy似乎沿着正確的路線,但我仍然不能包裹我的頭。幫助讚賞。

+0

注意:您可以使用'len(list(...))'。哦,並明確指出'itertools' plz。 –

+1

@KarolyHorvath我最初嘗試使用'len(list(...))'(並且現在再次檢查),它返回0 - 這就是我添加計數器的原因。 –

+0

那就是......我應該怎麼說...... *有趣* ......在這裏工作。 –

回答

3

就我所知,你在找什麼叫做powerset。 以下是此方法的一些實現: Getting the subsets of a set in Python

+0

謝謝 - 這正是我想要的 - 有效地在設置中缺少的項目是「關」值,我可以制定我的過濾器。非常感謝,謝謝! –

2

您正在使用permutations錯誤的方法。看看the documentation

>>> permutations('ABCD', 2) 
AB AC AD BA BC BD CA CB CD DA DB DC 

你只是混合您filters價值和創造所有的可能性,這是7! = 5040.

你想要的是product(0, 1)七次。

>>> p = product((0, 1), repeat=7) 
>>> print(len(p)) 
128 
# [(0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0, 0, 0, 1), ...] 
+0

謝謝 - 已經接受了其他答案(因爲它給了我「過濾器」的實際列表,而在這裏我仍然需要再次將過濾器序列與0/1列表相關聯。我今天學到了關於'itertools'的一些東西。 –

+1

@MattAndrews當然,最主要的是你已經解決了你的問題,我希望你現在能更好地理解如何使用'product()'和'permutations()'。 – Delgan

相關問題