python:IndexError:字符串索引超出范围

时间:2013-06-28 11:24:44

标签: python

从谷歌教程学习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

2 个答案:

答案 0 :(得分:5)

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')的布尔标志对单词进行排序; FalseTrue之前排序,因此我们否定该测试,然后是单词本身。

演示:

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

答案 1 :(得分:0)

  

我需要对列表进行排序,但以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]仅在列表已有j元素时才有效,但在您将项目添加到最初为空的列表时,应使用lis.append(...)代替。
  2. 您要从列表中删除索引i处以“x”开头的字词,但pop()将始终删除 last 项目。 pop()用于堆栈;在使用索引循环时,永远不要从列表中删除项目!
  3. 您在列表中弹出项目之后应用[i]运算符,即您正在访问单词<{1}} 字母< / em>,可能会短得多;因此i