2011-11-04 51 views
-1

使用python 2.7。運行循環monte carlo sim時拉鍊的麻煩; python

我確定代碼有點笨拙,但我會盡量簡單地解釋它。

我有兩個列表:

T = [[1,0], [1,0], [0,5]] 
S = [[1], [3], [2]] 

我需要從b添加相應的值,以T中的對應列表的末尾,所以使用拉鍊,我把它們放在一起。

然後,我計算每個列表的第一個值從第三個減去的結果,並使用另一個zip函數附加該值。所以當我運行我的函數時,T變量現在看起來像[[1,0,1,0],[1,0,3,-2],[0,5,2,-2]] 。

然後我有一系列的if語句,如果某些值高於或低於其他值,則列表返回勝利,損失或平局。

我想多次模擬我的函數(starterTrans)的結果。問題是,當我使用:

def MonteCarlo(T, S, x): 
    for i in range(0, x): 
     starterTrans(T, S) 

對於每一個模擬我得到那麼通過模擬T A不同版本T的第一次在每個列表(四)個元素的適當數量,但經過每一個都會經過,越來越多的變量被添加。

我需要一種方法將T鎖定到原來的四個變量,無論我想使用它多少次。我正在努力尋找一種方式來這樣做。有任何想法嗎?

我知道我的代碼是令人費解的,但在這裏它是如果它可以幫助任何人都跟着我試圖說明我的問題:

def starterTrans(team, starter): 
    wins = 0 
    losses = 0 
    nd = 0 
    random.shuffle(team) 
    for t, s in zip(team, starter): 
     t.extend(s) 
    score_add(team, exit_score(team, starter)) 
    length = len(starter) 
    for i in range(0, length): 
     if team[i][4] > 0 and (team[i][1] > -team[i][4]) and team[i][2] >= 5: 
      wins += 1 
     elif team[i][4] < 0 and (team[i][1] <= -team[i][4]): 
      losses += 1 
     elif (team[i][4] <= 0 and team[i][1] >= -team[i][4]): 
      nd += 1 
    return wins, losses, nd 

def score_add(team, exit_scores): 
    for t, e in zip(team, exit_scores): 
     t.append(e) 
    return team 

def exit_score(team, starter): 
    exit_scores = [] 
    length = len(starter) 
    for i in range(0, length): 
     score = team[i][0]-team[i][3] 
     exit_scores.append(score) 
    return exit_scores 

def MonteCarlo(team, starter, x): 
    for i in range(0, x): 
     starterTrans(team, starter) 

感謝您的幫助。

+0

我想我可能已經修好了。 –

+0

如果我更改了代碼,starterTrans只需要一個參數(啓動器) –

+0

然後我有團隊= [[1,0],[1,0],[0,5]],團隊始終保持不變。 –

回答

1

我想你只需要改變這一點:

def MonteCarlo(T, S, x): 
    for i in range(0, x): 
     starterTrans(T, S) 

這樣:

def MonteCarlo(T, S, x): 
    for i in range(0, x): 
     starterTrans(T[:], S) 

這將傳遞的T副本starterTrans(..)代替原有的列表中。如果您在starterTrans(..)中編輯T的元素,這將無濟於事。在這裏你需要一個深層複製。看看這裏的淺拷貝和深拷貝之間的區別:What is the difference between a deep copy and a shallow copy?

0

將最後一行更改爲starterTrans(team[:], starter)。這將通過團隊的副本,保留原來的完整。

+0

你只是在MonteCarlo腳本中說?我試過了,它仍然添加到列表中。 –