2017-09-06 35 views
3

下面的代碼給出了數組的所有排列,我想寫一個函數,可以一次使用一個排列(我想處理在不產生它們全部提前,爲了能夠在目標函數使用它時,例如[2,3,5,4,1,6]一個置換)如何寫一個函數來獲取一次一個數組中的pym對象

s = np.array([1, 2, 3, 4, 5, 6]) 
from itertools import permutations 
for s_temp in permutations(s): 
    print (s_temp) 
+7

'permutations(s)'是一個迭代器,因此您可以一次處理「一次一個置換」而不提前全部生成它們,這不是您想要的嗎? –

+3

你在正確的軌道上,但沒有更多的上下文,不可能告訴你該做什麼。 –

+0

打印每次消耗一個排列?你可以用任何作用於一個排列的函數代替print。 – Quickbeam2k1

回答

1

你有幾個posibilities,首先permutations返回一個迭代器,這樣您的代碼就可以通過更改print來適應需要調用的任何內容。

from itertools import permutations 
def process(s): 
    for s_temp in permutations(s): 
     call_your_stuff(s_temp) 

而且一旦你有排列對象,你可以得到它的調用next的下一個項目:

from itertools import permutations 
s = permutations(range(3)) 
s 
<itertools.permutations object at 0x000000000377CFC0> 
next(s) 
(0, 1, 2) 

如果要處理每個你可以使用map的排列相同的功能,只需更換該示例中的lambda功能無論你需要調用:

s = permutations(range(3)) 
map(lambda (x, y, z): x+y-z, s) 
[-1, 1, -1, 3, 1, 3] 

可以收集數據轉換成用於進一步處理列表:

s = list(permutations(range(3))) 
s 
[(0, 1, 2), (0, 2, 1), (1, 0, 2), (1, 2, 0), (2, 0, 1), (2, 1, 0)] 

請注意,如果你不一旦你消耗的置換對象的迭代器,數據將被「丟失」收集的數據(成一個列表,元組等),(你將有再次重新計算)

+0

謝謝!欣賞它,這有助於 –

相關問題