2013-05-31 36 views
2

所以我一直在尋找通過這個網站來嘗試解決我的問題,但我不認爲有人有我的具體問題? 我想要做的是迭代並通過重複創建列表的排列。類似於如果我想要所有可能的結果滾動4次骰子3次。我不知道如果我的代碼實際上要達到這個目的,但手頭上的問題是這樣的:索引超出範圍,但列表中包含元素?

我有這樣的代碼:

ops = ["add", "sub", "mul", "div"]  
def opsy(): 
    opslist=["cat", "dog", "cow"] 
    for w in ops: 
     opslist[0] = w 
     for x in ops: 
      opslist[1] = x 
      for y in ops: 
       opslist[2] = y 
       opsarray.append(opslist) 

而且我得到這個錯誤:

IndexError: 'list assignment index out of range' 

我的理解應該是因爲opslist被定義爲一個空列表,所以我改變了它(如上面的代碼所示),我仍然得到錯誤? 另外我不認爲「append」不是我想要的,我需要能夠更改特定索引而不是僅添加項目。我也不想使用模塊(itertools),我真的很想自己編程。 非常感謝。編號: 我不知道爲什麼我有錯誤呢?但無論如何,martineau對opsarray = [[w, x, y] for y in ops for x in ops for w in ops]的評論爲我想做的事情工作。所以是的。謝謝!

+2

如果你想要爲了構建組合,請使用'itertools.product()'代替:'opsarray = itertools.product(ops,repeat = 3)'。即使你沒有超出範圍的錯誤,你仍然只是一次又一次地將*相同的列表*添加到'opsarray',所以你會得到相同的結果重複4 ** 3 = 64次。 –

+2

我無法用此代碼重現您的異常。 –

+0

我不能。你需要添加'opsarray = []'來追加它,除此代碼運行良好外。 – nsfyn55

回答

6

你的代碼是而不是引發異常。然而,您確實有不同的問題:您將同時添加相同的列表(opslist)到opsarray 64次,同時不斷更改該列表。最後,你有64個引用同一個列表:

>>> opsarray 
[['div', 'div', 'div'], ['div', 'div', 'div'], ['div', 'div', 'div'], ['div', 'div', 'div'], ['div', 'div', 'div'], ['div', 'div', 'div'], ['div', 'div', 'div'], ['div', 'div', 'div'], ['div', 'div', 'div'], ['div', 'div', 'div'], ['div', 'div', 'div'], ['div', 'div', 'div'], ['div', 'div', 'div'], ['div', 'div', 'div'], ['div', 'div', 'div'], ['div', 'div', 'div'], ['div', 'div', 'div'], ['div', 'div', 'div'], ['div', 'div', 'div'], ['div', 'div', 'div'], ['div', 'div', 'div'], ['div', 'div', 'div'], ['div', 'div', 'div'], ['div', 'div', 'div'], ['div', 'div', 'div'], ['div', 'div', 'div'], ['div', 'div', 'div'], ['div', 'div', 'div'], ['div', 'div', 'div'], ['div', 'div', 'div'], ['div', 'div', 'div'], ['div', 'div', 'div'], ['div', 'div', 'div'], ['div', 'div', 'div'], ['div', 'div', 'div'], ['div', 'div', 'div'], ['div', 'div', 'div'], ['div', 'div', 'div'], ['div', 'div', 'div'], ['div', 'div', 'div'], ['div', 'div', 'div'], ['div', 'div', 'div'], ['div', 'div', 'div'], ['div', 'div', 'div'], ['div', 'div', 'div'], ['div', 'div', 'div'], ['div', 'div', 'div'], ['div', 'div', 'div'], ['div', 'div', 'div'], ['div', 'div', 'div'], ['div', 'div', 'div'], ['div', 'div', 'div'], ['div', 'div', 'div'], ['div', 'div', 'div'], ['div', 'div', 'div'], ['div', 'div', 'div'], ['div', 'div', 'div'], ['div', 'div', 'div'], ['div', 'div', 'div'], ['div', 'div', 'div'], ['div', 'div', 'div'], ['div', 'div', 'div'], ['div', 'div', 'div'], ['div', 'div', 'div']] 
>>> id(opsarray[0]) == id(opsarray[1]) 
True 

您要創建新的列表:

ops = ["add", "sub", "mul", "div"]  
def opsy(): 
    for w in ops: 
     for x in ops: 
      for y in ops: 
       opsarray.append([w, x, y]) 

或者更好的是,使用itertools.product()

from itertools import product 
opsarray = list(product(ops, repeat=3)) 

導致:

[('add', 'add', 'add'), ('add', 'add', 'sub'), ('add', 'add', 'mul'), ('add', 'add', 'div'), ('add', 'sub', 'add'), ('add', 'sub', 'sub'), ('add', 'sub', 'mul'), ('add', 'sub', 'div'), ('add', 'mul', 'add'), ('add', 'mul', 'sub'), ('add', 'mul', 'mul'), ('add', 'mul', 'div'), ('add', 'div', 'add'), ('add', 'div', 'sub'), ('add', 'div', 'mul'), ('add', 'div', 'div'), ('sub', 'add', 'add'), ('sub', 'add', 'sub'), ('sub', 'add', 'mul'), ('sub', 'add', 'div'), ('sub', 'sub', 'add'), ('sub', 'sub', 'sub'), ('sub', 'sub', 'mul'), ('sub', 'sub', 'div'), ('sub', 'mul', 'add'), ('sub', 'mul', 'sub'), ('sub', 'mul', 'mul'), ('sub', 'mul', 'div'), ('sub', 'div', 'add'), ('sub', 'div', 'sub'), ('sub', 'div', 'mul'), ('sub', 'div', 'div'), ('mul', 'add', 'add'), ('mul', 'add', 'sub'), ('mul', 'add', 'mul'), ('mul', 'add', 'div'), ('mul', 'sub', 'add'), ('mul', 'sub', 'sub'), ('mul', 'sub', 'mul'), ('mul', 'sub', 'div'), ('mul', 'mul', 'add'), ('mul', 'mul', 'sub'), ('mul', 'mul', 'mul'), ('mul', 'mul', 'div'), ('mul', 'div', 'add'), ('mul', 'div', 'sub'), ('mul', 'div', 'mul'), ('mul', 'div', 'div'), ('div', 'add', 'add'), ('div', 'add', 'sub'), ('div', 'add', 'mul'), ('div', 'add', 'div'), ('div', 'sub', 'add'), ('div', 'sub', 'sub'), ('div', 'sub', 'mul'), ('div', 'sub', 'div'), ('div', 'mul', 'add'), ('div', 'mul', 'sub'), ('div', 'mul', 'mul'), ('div', 'mul', 'div'), ('div', 'div', 'add'), ('div', 'div', 'sub'), ('div', 'div', 'mul'), ('div', 'div', 'div')] 
+0

'opsarray = [[w,x,y] for y in ops for x in ops for w in ops]'是另一種非常簡潔的可能性。 – martineau

+1

的確,但是'itertools.product()'可用,那裏確實沒有必要。 –