即使在初始化var作为索引之后,索引也超出范围

时间:2015-09-29 23:15:02

标签: python indexing

如果我初始化j,我不明白为什么这超出了范围。

此扩展迭代斜杠的所有前面的字符,当与空格结合时,它会相乘。

    5</ --> 5<5<
    5<// --> 5<5<5<
    5</ / --> 5<5< 5<5<

另外,这是完成任务的最佳方式吗?

    def ttExpand( program ) :
        """
        expand the string manipulation symbols in program into
        a TinyTurtle language program.
        program -- a TinyTurtle string, possibly with string manipulation symbols
        Returns -- a TinyTurtle string after expansion
        """
        new_program = ''
        array = []
        i = 0
        j = 0
        for ch in program: #while program.index(ch) != len(program) - 1:

            if ch == '/':
                array.append(program.index(ch))
                i += 1
        if len(array) == 0:
            return program

        while j <= len(array):
            new_program += (program[:array[j]])
            j += 1
        return new_program

3 个答案:

答案 0 :(得分:1)

这不会产生正确的结果,但它确实做了尝试做的事情:

#while j <= len(array):
for i in array:
    new_program += program[:i] #(program[:array[j]])

出现这种方法实际上可以实现你想要的东西:

def tt_expand(program):
    '''
    expand string manip symbols

    Example:

    >>> tt_expand('5</')
    '5<5<'
    >>> tt_expand('5<//')
    '5<5<5<'
    >>> tt_expand('5</ /')
    '5<5< 5<5<'
    '''

    seen = ''
    new_program = ''
    prev_token = None
    for i, token in enumerate(program):
        if token == '/':
            if prev_token == ' ':
                new_program += new_program.rstrip()
            else:
                new_program += seen
        else:
            new_program += token
            seen += token
        prev_token = token

    return new_program



if __name__ == '__main__':
    import doctest
    doctest.testmod()

答案 1 :(得分:1)

直接原因是使用while j <= len(array):然后使用array索引j;序列的索引从0开始,结束len(array) - 1(通常描述为从0(包括)到len(array)(不包括))。

保留大部分代码的简单修补方法是更改​​为while j < len(array),以便停在array中的最后一个可用索引处。也就是说,你的编码就像你刚刚来自C,索引而不是迭代。

如果您发现自己的循环结构如下:

 i = 0
 while i < len(someseq):
     item = someseq[i]  # or equivalent, where you only use the value retrieved by indexing, not the index itself

你真正想要的是:

 for item in someseq:

在极少数情况下,您可能还需要索引(在分配回原始序列时),在这种情况下您需要:

 for i, item in enumerate(someseq):

其中任何一个都比重新发明C风格的for循环明显更快更简单(重新检查每次传递的长度,索引与直接迭代相比增加了惊人的开销)。

答案 2 :(得分:0)

你必须这样做:

while j <= len(array) - 1