Python "IndexError: string index out of range"(初学者)

标签 python sorting

因此,对于编程作业,我们必须用 Python 重新编写排序函数来对单词列表进行排序。到目前为止,我已经让它能够根据每个单词的首字母对单词进行排序,现在我正在尝试运行递归以在首字母或任何字母相同的情况下对其进行排序。我遇到“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 正在变得比单词大,但是当字母不相同时它会不停地运行很多次,所以我有点困惑为什么要这样做。任何帮助将不胜感激

更新

好的,现在它可以工作了,但是当我将它放入提供的代码中以测试大约 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 "IndexError: string index out of range"(初学者),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19308057/

相关文章:

python - 如何正确执行ManyToMany字段的django查询

python - 将列表从纪元转换为人类可读时间

mysql - 按最接近指定日期的行排序,但将过去的记录放在结果集的末尾

java - 如果有零则向左移动

Java:如何按列表的大小对列表列表进行排序?

python - ConfigParser - 将整个部分作为字典获取并设置值

python - 自定义排序 Python 字典

mysql - MySQL中的循环顺序

Python根据列表中的日期获取记录

python - 在 python 的 sklearn 中绘制 DBSCAN 中的特定点