【问题标题】:python: IndexError: string index out of range [duplicate]python:IndexError:字符串索引超出范围[重复]
【发布时间】:2013-06-26 03:53:08
【问题描述】:

m 从谷歌教程中学习 python。我被困在与列表有关的练习上。 出现索引错误

  lis[j]=words.pop()[i]
IndexError: string index out of range

我需要对列表进行排序,但以 x 开头的单词应该是第一个。

代码是

def front_x(words):
    i=0
    lis=[]
    j=0
    k=0
    words.sort()

    while i<len(words):
        if words[i][0:1]=="x":
            lis[j]=words.pop()[i]
            j+=1
        i+=1
    lis.extend(words)
    while k<len(lis):
        print(lis[k])
        k+=1
    return

【问题讨论】:

  • 您可以发布您正在使用的数据吗?

标签: python


【解决方案1】:

我需要对列表进行排序,但以 x 开头的单词应该是第一个。

作为@Martijn 扩展答案中自定义搜索键的补充,您也可以试试这个,它更接近您的原始方法并且可能更容易理解:

def front_x(words):
    has_x, hasnt = [], []
    for word in sorted(words):
        if word.startswith('x'):
            has_x.append(word)
        else:
            hasnt.append(word)
    return has_x + hasnt

关于你的原始代码有什么问题,实际上有三个行问题

lis[j]=words.pop()[i]
  1. lis[j] 仅在列表已经有 jth 元素时才有效,但是当您将项目添加到最初为空的列表中时,您应该改用 lis.append(...)
  2. 您想从列表中删除索引i 处以“x”开头的单词,但pop() 将始终删除最后一个 项。 pop() 用于堆栈;永远不要在使用索引循环列表时从列表中删除项目!
  3. 从列表中弹出项目后应用[i] 运算符,即,您正在访问ith 单词的字母,这可能要短得多;因此IndexError

【讨论】:

    【解决方案2】:

    lis 是一个空列表,任何索引都会引发异常。

    如果您想向该列表添加元素,请改用lis.append()

    请注意,您可以直接循环遍历序列,无需保留自己的计数器:

    def front_x(words):
        lis = []
        words.sort()
    
        for word in words:
            if word.startswith("x"):
                lis.append(word)
        for entry in lis:
            print(entry)
    

    您可以通过立即打印所有以x 开头的单词来进一步减少这种情况,无需构建单独的列表:

    def front_x(words):
        for word in sorted(words):
            if word.startswith("x"):
                print(word)
    

    如果您想对列表进行排序,所有 x 单词都在前,请使用自定义排序键:

    def front_x(words):
        return sorted(words, key=lambda w: (not w.startswith('x'), w))
    

    首先按.startswith('x') 的布尔标志对单词进行排序; False 排在 True 之前,所以我们否定那个测试,然后是单词本身。

    演示:

    >>> words = ['foo', 'bar', 'xbaz', 'eggs', 'xspam', 'xham']
    >>> sorted(words, key=lambda w: (not w.startswith('x'), w))
    ['xbaz', 'xham', 'xspam', 'bar', 'eggs', 'foo']
    

    【讨论】:

    • 如果以 x 开头的单词已经按字母顺序排列,则您的方法 wud 有效。但如果没有,这将失败。练习的意思是按字母顺序排列单词,条件是首先排列以“x”开头的单词。
    • @shanzyshan:不,不会。键返回一个元组;在对第一个值进行排序后,项目将在第二个值上排序。
    • @martin。好的,我试试这个。
    • 你可能已经发现我是 python 新手。我无法理解的一件事是,在 for *** in *** 语句中,编译器如何能够在我们尚未定义它们时拾取它们。例如。在您的代码中,这一行是针对单词中的单词给出的,我们刚刚将单词定义为列表,但是编译器如何识别单词。即使在排序(单词)中的单词也没有定义单词,我也不认为有一些命令排序()。你能解释一下吗?
    • @shanzyshan:Python 的语法规定word 将被分配。编译器知道它是一个赋值目标,所以 word 将被定义为一个本地名称,只需在循环语句中使用它。这一切都记录在Python reference documentation中。
    猜你喜欢
    • 2012-03-04
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    • 2017-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多