在Python`for`循环中获取索引错误

时间:2017-03-21 21:13:35

标签: python python-3.x for-loop tuples indexoutofboundsexception

目标:将空的ASCII网格转换为井字棋盘。 空的时候应该看这个:

        |        |     
        |        |    
    ____|________|____
        |        |    
        |        |    
    ____|________|____
        |        |    
        |        |    
        |        |   

错误:

def myformat(moves, line):
# there's got to be a better way to do this
    if line in [1, 4, 7]:
        if moves[line] == 'x':
            return "\  /"
        elif moves[line] == 'o':
            return " oo "
        elif moves[line] == 'none':
            return "    "
    elif line in [2, 5, 8]:
        if moves[line] == x:
            return " xx "
        elif moves[line] == o:
            return "o  o"
        elif moves[line] == "none":
            return "    "
    elif line in [3, 6]:
        if moves[line] == x:
            return "/__\b"
        elif moves[line] == o:
            return "o__o"
        elif moves[line] == "none":
            return "____"
    elif line == 9:
        if moves[line] == x:
            return "/__\b"
        elif moves[line] == o:
            return "o__o"
        elif moves[line] == "none":
            return "    "        
    else:
        print("Fatal error.")
>>> moves = ['none']*9
>>> moves
['none', 'none', 'none', 'none', 'none', 'none', 'none', 'none', 'none']
>>> for line in range(1, 10):
   print("{}|{}|{}".format((myformat(moves, line))))

Traceback (most recent call last):
  File "<pyshell#24>", line 2, in <module>
    print("{}|{}|{}".format((myformat(moves, line))))
IndexError: tuple index out of range

full code因为人们上次生气我只发布了部分

我不明白它为什么提到元组。我看到的唯一一个是范围(1,10)函数,因为它是for循环,所以不应该是索引错误。所有评论和批评都表示赞赏。提前谢谢。

2 个答案:

答案 0 :(得分:0)

在你的例子中,line = 1 myformat()会返回一个包含5个空格的字符串..

让我们试试

>>> ret_val = '     '
>>> '{} | {} | {}'.format(ret_val)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: tuple index out of range

@ Jean-FrançoisFabre,已经解释过格式需要3个值 由于只有1个值字符串格式无法找到缺失值 你需要通过providong指数告诉格式它应该放在哪里。

>>> ret_val = '     '
>>> '{0} | {0} | {0}'.format(ret_val)
'      |       |      '

答案 1 :(得分:0)

您的代码存在三个问题。

首先,您的调用代码需要获得三个值,但您只需从函数中返回一个值。

第二个问题是,在函数中,您使用来自调用代码中的moves的值索引range(1, 10)。由于排除了stop range参数,因此最大值为9。这是moves(有九个值)的界限。 Python从零开始索引,因此您可能需要range(0, 9)或仅range(9)(或者您需要在获取每个索引之前从值中减去一个)。

第三个问题是,您似乎在函数中将line用于两个不同的目的。您正在使用它来索引电路板上的方块阵列(通过moves列表)。而且您还使用它来对输出中的水平文本行进行编号。那些不是一回事,所以如果你继续交替使用它们,你会得到奇怪的结果。

我不确定计算所需值的最佳方法是什么。如果您坚持迭代输出的行并希望函数返回三个值(对于行交叉的三个方格),则需要从line传入range(9)值并且然后使用line // 3加上来自range(3)的值(将指向三个不同的方格)进行索引。