2016-10-12 63 views
-1

我在列表變量中有五個元素(稱之爲A)。我想表示這五個元素的每個可能的順序,每個順序都作爲一個列表存儲在另一個列表中(稱爲B)。如果我將A附加到B然後嘗試重新洗牌A以獲得新訂單,則先前存儲在B中的列表也將被分配給A,因此在試圖產生A的五個元素的25個不同順序之後,I在B中獲得25個同樣的訂單。有沒有一種方法可以將A添加到B中,然後在不洗牌B中的附加A的情況下洗牌A?如何將列表轉儲到列表中而不是追加它Python

以下是基本代碼:


from random import shuffle 

A = ["M1", "M2", "M3", "M4", "M5"] 

B = [] 

for i in range(len(A) * 5): 
    shuffle(A) 
    temp = A 
    B.append(temp) 


print (T) 

感謝

+0

在第四行上,B.append(temp)意味着在一個新行上。 – fevrierm

+1

'T'('print(T)')? –

+4

'from itertools import permutations \\ B = list(permutations(A))'? – Efferalgan

回答

-1

你應該使用複製或deepcopy的。

from copy import deepcopy, copy 
from random import shuffle 

A = ["M1", "M2", "M3", "M4", "M5"] 

B = [] 
# Use deep deepcopy if you have lists with lists e.g. [[12, [2]], [2]] 
for i in range(len(A) * 5): 
    shuffle(A) 
    B.append(deepcopy(A)) 
# But in this case better to use copy() 
C = [] 
for i in range(len(A) * 5): 
    shuffle(A) 
    C.append(copy(A)) 
+1

爲什麼你使用'deepcopy'而不是'copy'? –

+0

你是對的,在這種情況下更好地使用副本。謝謝。我編輯了答案 –

2

我要代表爲每一個訂單被存儲在另一個列表的列表中的那些五行每一個可能的順序。

假設這是一個XY problem,讓我們退一步考慮:洗牌的找到所有排列的正確方法。

有是做所有的這一步標準庫解決方案(在評論中已經提及):

>>> from itertools import permutations 
>>> list(permutations(["M1", "M2", "M3", "M4", "M5"])) 
[('M1', 'M2', 'M3', 'M4', 'M5'), ...] # and off to the races... 

注意它返回的元組名單,這應該是罰款您意圖和目的。如果需要,您可以使用列表理解將它們轉換爲列表。