2013-08-29 58 views
0

我想查找包含只有1和-1的四元素向量的所有組合。 (1,1,1,1),( - 1,1,1,1),...( - 1,-1,-1,-1)等 我的想法做到這一點是非常低效的im當然,但我想不出另一種方式來做到這一點,所以這就是我想要做的。 我發現有多少個總的向量,然後創建了許多空列表。我從矢量A開始,然後將其與vectors中的每個列表進行比較。如果A與任何列表匹配,我隨機更改A元素的符號,然後再次檢查新列表Avectors。如果A未找到匹配項,則將其替換爲vectors中的列表,並將while循環遞增1.這應該繼續,直到找到並打印所有可能的組合。 但是,我的代碼只是吐出vectors中的第一個更改,然後連續循環而不添加任何新的Avectors。任何人都可以發現我的代碼中沒有做到我打算做的和/或指向正確的方向嗎?由於試圖找到一個2狀態向量(在python中)的所有組合

import random 
numvec = 2**4 # number of macrostates for a 4 component 2-state system 

vectors = [[0,0,0,0] for i in range(numvec)] #initializing the numvec vectors 
A = [1,1,1,1] 
i = 0 
while i < 16: 
    if any(x == A for x in vectors): 
     y = random.randrange(0, 3) 
     A[y] = A[y] * -1 
    else: 
     vectors[i] = A 
     print vectors[i] 
     i += 1 

print vectors 

哦,我再次意識到這種方法是非常低效的,但因爲這是一個家庭作業,我更關心的是能夠得到蟒蛇做我想做的事情,然後使用大量的建在功能上爲我做工作。再次感謝。

回答

1
vectors[i] = A 

這並不創造A副本。當您更改A時,vectors的內容會更改,因爲vectors[0]A是此行首次運行後的同一個對象。要解決此問題,請每次都創建一個新的A對象,或者複製A並將副本插入列表中。

如果你想製作一個副本,您可以用Python's slice notation

vectors[i] = A[:] 
+0

是的!就是這樣!這是唯一的問題,現在它的工作。非常感謝 – user2727518

3

我想你可以用itertools.product內置函數很容易做到這一點:

list(itertools.product([-1,1], repeat=4)) 

或者,你可以用一個列表理解這一切寫出來的。這是更爲詳細,但它避免了使用itertools庫:

list((i,j,k,l) for i in (-1,1) for j in (-1,1) for k in (-1,1) for l in (-1,1)) 
+0

是的,我已經得到了這樣的印象,我可以用'itertools'但我儘量不使用它,因爲這將是太容易了。這項任務的目的是爲了獲得一些經驗,如果使用 – user2727518

+0

好的感謝,這是好的食物,我會挑戰性地看待'itertools'可以爲未來的項目做什麼 – user2727518

+0

第二個答案不使用itertools萬一你沒有注意到。 – Joohwan

0

教育目的(考慮到人有類似的問題可能正在爲一般遞歸方法 - 一個經典的任務)

def get_possibilities(elements, length=1): 
    if length == 0: 
     return [[]] 

    if length > 0: 
     tails = get_possibilities(elements, length=length-1) 
     return [[x] + t for x in elements for t in tails] 

results = get_possibilities([1,-1], 4) 

這是如何工作的例子:

[1,-1], length=4 
call get_possibilities([1,-1],4) (main) 
call get_possibilities([1,-1],3) (from get_possibilities) 
call get_possibilities([1,-1],2) (from get_possibilities) 
call get_possibilities([1,-1],1) (from get_possibilities) 
call get_possibilities([1,-1],0) (from get_possibilities) 

return [[]] (from the [1,-1], 0 call) 

merge any element (here 1,-1, as list) with any element of the prior return 
return [[1],[-1]] (from the [1,-1], 1 call) 

merge any element (here 1,-1, as list) with the prior return 
return [[1, 1], [1, -1], [-1, 1], [-1, -1]] (from the [1,-1], 2 call) 

merge any element (here 1,-1, as list) with the prior return 
return [[1, 1, 1], [1, 1, -1], [1, -1, 1]...] (8 elements, 2**3) (from the [1,-1], 3 call) 

merge any element (here 1,-1, as list) with the prior return 
return [[1, 1, 1, 1], [1, 1, 1, -1], ...] (16 elements 2**4) (from the [1,-1], 4 call) 

問候

PS:我猜itertools.product工作方式類似;)

相關問題