所以我一直在浏览这个网站试图解决我的问题,但我认为没有人有我的具体问题? 我正在尝试做的是迭代并使用重复创建列表的排列。类似于我想要所有可能的结果滚动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),我真的想自己编程。
非常感谢。
编辑:
我不知道为什么我有错误呢?但无论如何,马蒂诺对opsarray = [[w, x, y] for y in ops for x in ops for w in ops]
的评论是为了我想做的事情。是的谢谢!
答案 0 :(得分: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')]