【问题标题】:List index out of range error in matrix矩阵中的列表索引超出范围错误
【发布时间】:2016-05-14 20:02:05
【问题描述】:

我正在尝试根据块周围的块对块应用不同的纹理,但在执行代码时出现“列表索引超出范围”错误。

我已经搜索并尝试解决问题几个小时,我认为我做的不对,但我想不出正确的方法。

level = [
#                     1 1 1 1 1 1 1 1 1 1 2 2 2
# 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2
[ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],#0
[ 0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,1,1,1,0,0,0],#1
[ 0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,1,1,1,0,0,0],#2
[ 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,0],#3
[ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],#4
[ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],#5
[ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],#6
[ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],#7
[ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],#8
]
for i in range(9):
    for j in range(23):
        if level[i][j] == 1:
            #   LEFT                 TOP                   RIGHT                 BOTTOM
        if level[i][j-1] == 1 and level[i-1][j] == 1 and level[i][j+1] == 1 and level[i+1][j] == 1:
            block = Block( j*48, i*48, 48, 48, grey, "constructor_.png")

        if level[i][j-1] == 1 and level[i][j+1] != 1 and level[i+1][j] == 1 and level[i-1][j] != 1:
            block = Block( j*48, i*48, 48, 48, grey, "constructor_t.png")

        if level[i][j-1] == 1 and level[i-1][j] == 1 and level[i][j+1] == 1 and level[i+1][j] != 1:
            block = Block( j*48, i*48, 48, 48, grey, "constructor_b.png")

        if level[i][j-1] != 1 and level[i-1][j] == 1 and level[i][j+1] == 1 and level[i+1][j] == 1:
            block = Block( j*48, i*48, 48, 48, grey, "constructor_l.png")

        if level[i][j-1] == 1 and level[i-1][j] == 1 and level[i][j+1] != 1 and level[i+1][j] == 1:
            block = Block( j*48, i*48, 48, 48, grey, "constructor_r.png")

        if level[i][j-1] != 1 and level[i-1][j] != 1 and level[i][j+1] == 1 and level[i+1][j] == 1:
            block = Block( j*48, i*48, 48, 48, grey, "constructor_tl.png")

        if level[i][j-1] == 1 and level[i-1][j] != 1 and level[i][j+1] != 1 and level[i+1][j] == 1:
            block = Block( j*48, i*48, 48, 48, grey, "constructor_tr.png")

        if level[i][j-1] != 1 and level[i-1][j] == 1 and level[i][j+1] == 1 and level[i+1][j] != 1:
            block = Block( j*48, i*48, 48, 48, grey, "constructor_bl.png")

        if level[i][j-1] == 1 and level[i-1][j] == 1 and level[i][j+1] != 1 and level[i+1][j] != 1:
            block = Block( j*48, i*48, 48, 48, grey, "constructor_br.png")

        if level[i][j-1] != 1 and level[i-1][j] != 1 and level[i][j+1] == 1 and level[i+1][j] != 1:
            block = Block( j*48, i*48, 48, 48, grey, "constructor_tbl.png")

        if level[i][j-1] == 1 and level[i-1][j] != 1 and level[i][j+1] != 1 and level[i+1][j] != 1:
            block = Block( j*48, i*48, 48, 48, grey, "constructor_tbr.png")

        if level[i][j-1] != 1 and level[i-1][j] != 1 and level[i][j+1] != 1 and level[i+1][j] == 1:
            block = Block( j*48, i*48, 48, 48, grey, "constructor_tlr.png")

        if level[i][j-1] != 1 and level[i-1][j] == 1 and level[i][j+1] != 1 and level[i+1][j] != 1:
            block = Block( j*48, i*48, 48, 48, grey, "constructor_blr.png")

        if level[i][j-1] == 1 and level[i-1][j] != 1 and level[i][j+1] == 1 and level[i+1][j] != 1:
            block = Block( j*48, i*48, 48, 48, grey, "constructor_tb.png")

        if level[i][j-1] != 1 and level[i-1][j] == 1 and level[i][j+1] != 1 and level[i+1][j] == 1:
            block = Block( j*48, i*48, 48, 48, grey, "constructor_lr.png")

        else:
            block = Block( j*48, i*48, 48, 48, grey, "constructor_tblr.png")
        self.object_list_c.add(block)

我期待您的帮助。谢谢^.^

【问题讨论】:

  • 哪行代码出错了?
  • 什么是Block()
  • 就是“constructor_tl.png”上方的那个
  • Block() 是一个类,它运行良好。
  • 有很多复制/粘贴的代码。了解如何使用函数消除重复并变得更有表现力。

标签: python list matrix


【解决方案1】:

您的level 矩阵有 9 行 23 列。当你有像

这样的条件语句时
if level[i][j-1] == 1 and level[i-1][j] == 1 and level[i][j+1] == 1 and level[i+1][j] == 1:

j = 22 或i = 9 的情况下,您尝试访问level[i][j+1] 不存在的索引,回忆一下Python 中的列表索引从0 开始。我不清楚是什么您的代码正在执行,但一个明显的补救措施是减少您的 ranges,这样您就不会尝试在最终迭代中访问不存在的索引。

【讨论】:

  • 谢谢,你是对的,我在矩阵的最后一行有一个 1,这就是问题所在。
  • 不客气。我要补充一点,错误消息是非常明确的。如果您看到“列表索引超出范围错误”,您应该真正考虑在您的代码中尝试访问哪些索引。
猜你喜欢
  • 1970-01-01
  • 2012-11-26
  • 2017-02-12
  • 1970-01-01
  • 2013-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多