簡體   English   中英

Python“ IndexError:字符串索引超出范圍”(初學者)

[英]Python “IndexError: string index out of range” (Beginner)

因此,對於編程作業,我們必須在python中重新編寫sort函數以對單詞列表進行排序。 到目前為止,我已經使它能夠根據每個字母的第一個字母對單詞進行排序,現在我嘗試運行遞歸以在第一個字母或任何字母相同的情況下仍對它進行排序。 我在“ IndexError:字符串索引超出范圍”錯誤時遇到問題。 我到目前為止所擁有的是

def insertion_sort(bookwords):
    for index in range(1,len(bookwords)):
        global word
        word=bookwords[index]
        i=index-1
        word_checker(bookwords, 0, i)

def word_checker(bookwords, num, i):
    while i>=0:
        wordleft=bookwords[i]
        if ord(word[num])<ord(wordleft[num]):
            bookwords[i+1]=bookwords[i]
            bookwords[i]=word
            i=i-1
        elif ord(word[num])==ord(wordleft[num]):
            num=num+1
            word_checker(bookwords, num, i)
        else:
            break


bookwords=["michael", "maddy", "michelle", "monstor", "money", "mountain", "miniscus", "mega"]

insertion_sort(bookwords)

print bookwords

我猜num正在變得比單詞大,但是當字母不相同時,它會運行很多次而不會停止,所以我有點困惑為什么這樣做。 任何幫助將不勝感激

UPDATE

好的,現在可以工作了,但是當我將其放入提供的代碼中以測試大約700000個單詞的速度時,它運行了30多個,直到我將其停止為止,因為排序功能花了5秒鍾。 這也是我的一部分代碼

import re
import pygame

# 159.172 assignment 2
# 
def mysort(words):
for index in range(1,len(words)):
    word=words[index]
    i=index-1
    word_checker(words, i, word)

def word_checker(words, i, word):
while i>=0:
    wordleft=words[i]
    if word==wordleft:
        break
    elif word<wordleft:
        words[i+1]=words[i]
        words[i]=word
        i=i-1
    else:
        return

# Do NOT change anything below here:
#
# Compare two lists
def compare(l1,l2):
    if len(l1) != len(l2):
        return False
    for a,b in zip(l1,l2):
        if a!=b:
            return False
    return True

# Open the book
book=open("allsherlock.txt", "rt")

# Make a list of all the words in the book
bookwords=[]
for line in book:
    for word in re.findall(r'\w+', line):
        bookwords.append(word.lower())

print "Loaded",len(bookwords),"words"
sortedbookwords=bookwords[:]
pygame.init()
# Use the sort function to sort the words for testing
sortedbookwords.sort()
starttime=pygame.time.get_ticks()
# Call our sort function
mysort(bookwords)
print "Sort took",pygame.time.get_ticks()-starttime,"ms"
print "Correct sort:",compare(bookwords,sortedbookwords)

您必須更改此:

 elif ord(word[num])==ord(wordleft[num]):
     num=num+1
     word_checker(bookwords, num, i)
 else:

至:

 elif ord(word[num])==ord(wordleft[num]):
     num=num+1
 else:

然后會打印: ['maddy', 'mega', 'money', 'michael', 'michelle', 'miniscus', 'monstor', 'mountain']

我仍然看不到在那兒進行遞歸的意義,我認為插入排序不會做遞歸。

更新

按字符比較時,算法已損壞,但是python可以為您比較字符串,因此這將給出正確的結果:

def insertion_sort(bookwords):
    for index in range(1,len(bookwords)):
        global word
        word=bookwords[index]
        i=index-1
        word_checker(bookwords, i)

def word_checker(bookwords,  i):
    while i>=0:
        wordleft=bookwords[i]
        if word<wordleft:
            bookwords[i+1]=bookwords[i]
            bookwords[i]=word
        i=i-1

bookwords=["michael", "maddy", "michelle", "monstor", "money", "mountain", "miniscus", "mega"]
insertion_sort(bookwords)
print bookwords #prints ['maddy', 'mega', 'michael', 'michelle', 'miniscus', 'money', 'monstor', 'mountain']

幾件事:

  • Python對字符串進行零索引(因此從0到len(string)-1)。
  • 考慮只使用“ for”來遍歷每個字母。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM