索引超出范围,但列表中有元素吗?

时间:2013-05-31 01:24:55

标签: python list indexing

所以我一直在浏览这个网站试图解决我的问题,但我认为没有人有我的具体问题? 我正在尝试做的是迭代并使用重复创建列表的排列。类似于我想要所有可能的结果滚动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]的评论是为了我想做的事情。是的谢谢!

1 个答案:

答案 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')]