2016-09-06 63 views
-1

我是python的新手。我正在嘗試編寫mergesort的python代碼,我無法找到錯誤。獲取錯誤無法訂購的類型:int()> = list()

import math 
t = int(input()) 

def merge(lf,rf): 
    p=0 
    q= 0  
    b=[] 
    for i in range(len(rf)+len(lf)):  
     if (p>=len(lf)): 
      b.append(rf[q:]) 
      break 
     elif (q>=len(rf)): 
      b.append(lf[p:]) 
      break 
     elif (lf[p]>=rf[q]): 
      b.append(rf[q]) 
      q=q+1 
     else: 
      b.append(lf[p]) 
      p=p+1 
    return b 


def sort(a): 
    if (len(a)>1): 
     mid = int(len(a)/2) 
     lf=a[:mid] 
     rf=a[mid:] 
     lf=sort(lf) 
     rf=sort(rf) 
     a=merge(lf,rf) 
     print (a) 
    return a 

for i in range(t): 
    n = int(input()) 
    a = [0]*n 
    for j in range(n): 
     a[j]=int(input()) 
    sort(a) 
    print(a) 
+0

哪一行引發無法編碼的類型錯誤?簡而言之,您將整數與整數列表進行比較,並且這在Python 3中是不允許的。您可能已經忘記了索引列表引用(例如'x> l [i]'而不是'x> = l [i]'請閱讀http://stackoverflow.com/help/mcve – chepner

+1

for循環中的最後一個'print'語句打印原始列表,並且我不確定這是否是打算的。如果要打印排序列表相反,你將不得不重新分配'a'到'sort'的返回。 – Leon

+0

當你的Python代碼拋出一個錯誤時,如果你可以將_entire_ traceback錯誤信息粘貼到你的問題中,它是非常有用的,所以我們可以看到究竟是什麼導致了(把它放到一個代碼塊中,保存格式化) –

回答

2

此行

b.append(rf[q:]) 

追加列表rf[q:]b作爲單個項目。但那不是你真正想要的,因爲b最終包含數字的子列表以及它應該包含的數字。所以,你需要的rf[q:]添加內容b,你可以做到這一點與

b.extend(rf[q:]) 

類似的情況也適用於

b.append(lf[p:]) 

錯誤消息的出現是因爲你的代碼試圖在比較數字lf和​​會列出您不小心添加的子列表。

而且,萊昂在評論中提到,你需要做的

a = sort(a) 

在腳本中的第二個,最後一行是因爲你的sort功能不修改a你傳遞。


順便說一句,有沒有必要爲你導入的數學模塊中的這個腳本:你是不是在調用它的任何功能或使用任何它定義的常量。

1

當你要麼b.append(rf[q:])b.append(lf[p:]),你加入了列表作爲一個元素到列表中b,它看起來像它應該是一個整數列表。

相關問題