2016-10-18 64 views
1
def kindDetector(list): 
    for i in range(0,len(list)): 
     if type(list[i]) != type('a'): 
      return 0 
    return 1 

def findWords(list,i): 
    if i == 0: 
     return list[0] 
    if list[i] < findWords(list,i-1): 
     return list.pop(i) 
    else: 
     return list.pop(i-1) 

def sortWords(list,i): 
    result=[] 
    while i >= 0: 
     result.append(findWords(list,i)) 
     i -=1 
    print(result) 


list = input('Enter your words, with a space between.\t').split() 
i = len(list)-1 
if kindDetector(list): 
    sortWords(list,i) 

但在這裏我只能進入2個字時,我用3此嘗試它發生:Python的IndexError處理

Traceback (most recent call last): 
    File "C:/Users/honey/Desktop/python/selfMade/sortWords.py", line 26, in <module> 
    sortWords(list,i) 
    File "C:/Users/honey/Desktop/python/selfMade/sortWords.py", line 18, in sortWords 
    result.append(findWords(list,i)) 
    File "C:/Users/honey/Desktop/python/selfMade/sortWords.py", line 10, in findWords 
    if list[i] < findWords(list,i-1): 
IndexError: list index out of range 
+1

調試技巧是在該行之前打印我。然後你可以看到實際發生了什麼錯誤。有了這個錯誤,'i'要麼太大(3個字,大於2)或太小(小於0)。如果您可以在您的問題中發佈我的價值,它也可以幫助其他人。 –

+0

真的很難理解你在做什麼,但我認爲pb來自於你的程序中只有一個列表的事實,所以當你在遞歸調用中修改它時,它在其他調用中也會改變。 – polku

+0

噢好吧,對不起,我是初學者sooo ...,但非常感謝你們 –

回答

3

您有混合冒泡(即比較的鄰居,並試圖一個在將它們轉移直到列表排序的時間)與SelectionSort(即找到最小項目從一個未排序的列表,並將其追加到結果列表的前面)。

而且,有一些更多的問題在這裏:

  • Python的引用,這意味着你的函數接收手柄的原始列表,而不是一個副本通過變量。如果您在迭代時更改列表(您的pop()調用的內容),則會遇到索引錯誤。您的findWords功能有缺陷。您從後到前迭代並檢查當前元素是否按字典順序小於其前任(即左鄰鄰居)。您可能想要將pop -calls更改爲return陳述,不是嗎?

我也很快實現了一些基本的排序算法(沒有錯誤處理,類型比較使用等特點凡):

def is_list_of_strings(lst): 
    for i in range(0,len(lst)): 
     if type(lst[i]) not in (str, unicode): 
      return False 
    return True 

def is_sorted(lst): 
    if len(lst) < 2: 
     return True 
    for i in range(len(lst) - 1): 
     if not lst[i] < lst[i + 1]: 
      return False 
    return True 

def selection_sort(lst): 
    l = lst[:] # Copy! 
    r = [] 
    while len(l): 
     r.append(l.pop(l.index(min(l)))) 
    return r 

def insertion_sort(lst): 
    l = lst[1:] # Copy! 
    r = [lst[0]] 
    for e in l: 
     inserted = False 
     for w in r: 
      if e < w: 
       r.insert(r.index(w), e) 
       inserted = True 
       break 
     if not inserted: 
      r.append(e) 
    return r 

def bubble_sort(lst): 
    l = lst[:] # Copy! 
    while not is_sorted(l): 
     for i in range(len(l) - 1): 
      if l[i] > l[i + 1]: 
       tmp = l[i] 
       l[i] = l[i + 1] 
       l[i + 1] = tmp 
    return l 

if __name__ == '__main__': 
    lst = ['aaa', 'aba', 'aab', 'baz', 'bar'] 

    print('Valid list of strings?', is_list_of_strings(lst)) 
    print(lst, is_sorted(lst)) 

    bbl = bubble_sort(lst) 
    ins = insertion_sort(lst) 
    sel = selection_sort(lst) 

    print(bbl, is_sorted(bbl)) 
    print(ins, is_sorted(ins)) 
    print(sel, is_sorted(sel)) 

看一看他們,試着去了解他們,並有一個閱讀這三種技術在線。然後嘗試使用自己的函數重新實現它們。玩得開心編碼:)

+0

非常感謝你,幫了我很多。 :) –