代码之家  ›  专栏  ›  技术社区  ›  Allan J.

如何修复python中索引器错误:字符串索引超出范围

  •  0
  • Allan J.  · 技术社区  · 6 年前

    我的代码返回

    索引器:字符串索引超出范围

    该代码应该将一个字符串分成两组,并插入到列表中,但返回错误

    def tokenize(tokenlist):
        newList = [] 
        for i in range(1,6,2):
            newList.append(tokenlist[i]+tokenlist[i+1])
        return newList
    

    输入是 "abcdef" 还有 我期望的输出就是列表 ["ab","cd","ef"] 但我犯了个错误。我如何让我的代码实现我的目标?

    2 回复  |  直到 6 年前
        1
  •  2
  •   ted    6 年前

    您的输入长度为6,所以最后一个索引是 5

    你的 range 上升到 5.

    所以 i+1 在里面 tokenlist[i+1] 上升到 6 这导致了 IndexError 作为列表和字符串的索引 0 在python中

    正确的 range(0,6,2)

    更好的是,使用 len(tokenlist) 而不是6。

    请注意,如果这是奇怪的,你会得到一个错误。在这种情况下,您应该指定预期的行为。

    例如,如果最后一个字符可能是单独的,请使用字符串切片:

    def tokenize(tokenlist):
        newList = []
        for i in range(0, len(tokenlist), 2):
            newList.append(tokenlist[i: i + 2])
        return newList
    
    

    如前所述,在任何情况下,都应该根据python指南重构代码。例如

    def tokenize(tokenlist):
        newList = []
        for i in range(0, len(tokenlist), 2):
            newList.append(tokenlist[i] + tokenlist[i + 1])
        return newList
    
    
        2
  •  1
  •   Kingsley    6 年前

    看看打电话给 range( 1, 6, 2 ) .
    什么时候会发生 i = 5 ?

    这将使代码试图成为 tokenlist[5] tokenlist[6] ,而 "abcdef" ,只有元素 tokenlist[0] (a) 到 tokenlist(5) (f) 。

    所以这个范围内的元素不在列表的末尾。

    顺便说一句:这个函数在运行时应该做什么 len( tokenlist ) 是奇数吗?