Python赋值索引错误

时间:2013-10-25 00:15:32

标签: python indexing

def main():
    rows = int(input("Insert # of rows "))
    cols = int(input("Insert # of cols "))
    dept = int(input("Insert # of dept ")) 
    count = 0
    trash = count


    table = [[[ 0
        for i in range(cols) ]
             for j in range(rows) ]
                  for k in range (dept) ]
    print ()
    print ("Print empty table")
    print(table)
    print()

    print("Print each element")

    for i in range(rows):
        print("-" * 30, "rows", i+1)
        for j in range(cols):
            print("-" * 22, "col", j+1)
            for k in range (dept):        
                count += 1
                table [i][j][k] = count 
                print ("row", i+1, "column", j+1, "depth", k+1, "=", count)

    print()
    print(table)
main()

如果所有3个数字相同,则此工作正常。如果不是,则在第一次变量必须超过指定数量时停止。即。如果输入2,3和2,它将正常工作,直到它到达第3列然后停止,给出以下消息:

Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    main()
  File "C:/Users/***/Documents/prog123", line 28, in main
    table [i][j][k] = count
IndexError: list assignment index out of range

如果我拿出这条线:

table [i][j][k] = count 

它工作正常,但它没有填写表格。如果我只使它有两个维度(取出深度),它也可以正常工作。将代码行移至代码中的早期或晚期似乎也没有帮助。我已经在这里查看了类似的问题,但没有看到任何帮助我在这里发现错误的内容。

2 个答案:

答案 0 :(得分:2)

table = [[[ 0
    for i in range(cols) ]
         for j in range(rows) ]
              for k in range (dept) ]

这将使您的最里面列表(索引最后,即k)列表中包含cols元素。即使colsrows已切换,这也不是您的意思。

嵌套列表推导从内到外工作,所以你想要从循环它的方式向后写:

table = [[[ 0
    for k in range(dept) ]
         for j in range(cols) ]
              for i in range(rows) ]

然后你的其余代码应该保持不变。

答案 1 :(得分:0)

你的指数已经混淆了。

您使用dept外部列表构建了表,内部列表中包含cols个元素。然后,您尝试使用range(dept)上的循环和range(rows)的最外层列表来处理最内层元素。

Python列表推导应该从左到右阅读,就好像它们是嵌套的一样;你甚至用这样的方式格式化你的列表理解:

table = [[[ 0
    for i in range(cols) ]
         for j in range(rows) ]
              for k in range (dept) ]

但是你的第二个嵌套range()循环和索引与那个结构不匹配;分配时复制它。移出depts范围循环并调整您使用k引用单元格的方式:

for k in range(dept):        
    for i in range(rows):
        print("-" * 30, "rows", i+1)
        for j in range(cols):
            print("-" * 22, "col", j+1)
                count += 1
                table[k][i][j] = count 
                print("depth", k+1, "row", i+1, "column", j+1, "=", count)

注意嵌套现在如何匹配; kdept),然后irows),然后是jcols)。