簡體   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