0

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

2 回答 2

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')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']
于 2013-06-28T11:28:03.293 回答
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]仅当列表已经具有jth 元素时才有效,但是当您将项目添加到最初为空的列表中时,您应该lis.append(...)改用。
  2. 您想从列表中删除索引处以“x”开头的单词i,但pop()总是会删除最后一项。pop()用于堆栈;永远不要在使用索引循环列表时从列表中删除项目!
  3. 您在从列表中弹出项目后应用[i]运算符,即您正在访问单词的第 th 个字母,这可能要短得多;就这样iIndexError
于 2013-06-28T16:09:03.090 回答