2

そのため、プログラミングの課題では、単語のリストをソートするために Python でソート関数を書き直す必要があります。これまでのところ、それぞれの最初の文字に基づいて単語を並べ替えることができるようになりましたが、最初の文字またはいずれかの文字が同じ場合は、再帰を実行して並べ替えようとしています。「IndexError: string index out of range」エラーに問題があります。私がこれまでに持っているのは

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)
4

2 に答える 2

1

いくつかのこと:

  • Python は文字列をゼロでインデックス付けします (つまり、0 から len(string)-1 まで)。と
  • 「for」を使用して各文字を処理することを検討してください。
于 2013-10-10T23:58:20.127 に答える