2013-05-31 38 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()'可用,那里确实没有必要。 –