繁体   English   中英

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

[英]python: IndexError: string index out of range

我从Google教程中学习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

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')的布尔标志对.startswith('x')进行.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']

我需要对列表进行排序,但是以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()始终会删除最后一个项目。 pop()用于堆栈; 切勿在使用索引循环时从列表中删除项目!
  3. 从列表中弹出项目后,即可应用[i]运算符,即,您正在访问单词的i字母,该字母可能短得多; 因此, IndexError

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM