2017-01-25 9 views
-2

取得エラー:Pythonリストが整数として解釈されています。カウント反転

File "inversions.py", line 26, in merge 
if left[i] < right[j]: 
TypeError: 'int' object is not subscriptable 

マージソートの私の実装はとても似ています。リストを受け取り、それは長さです。ベースケースは、私は単にリストを返す場合の長さは、1である場合には(ないintとして、しかしリストとして):非ベースケースの状況で

def mergesort(arr, length): 
    if length == 1: 
     return arr 

ワーキングマージのソート機能:

n = length // 2 
    left = arr[:n] 
    right = arr[n:] 

    lsort = mergesort(left, len(left)) 
    rsort = mergesort(right, len(right)) 
    result = merge(lsort, rsort, length) 

    return result 
すべての再帰呼び出しが行われた後

def merge(left, right, length): 
    buff = [] 
    i = j = count = 0 

このマージ機能が明らかにマージソート機能によって呼び出されます。

は、次に以下の様に定義された2つのソートサブリストをマージするためのマージ機能があります。

それが働いて扱うこのマージ機能であれば、else文があります。

if left[i] < right[j]: 
     buff.append(left[i]) 
     i += 1 

     if i == len(left): 
      for j in range(j, len(right)): 
       buff.append(right[j]) 
      break 

    elif left[i] > right[j]: 
     buff.append(right[j]) 
     j += 1 

     count += len(left) - i 

     if j == len(right): 
      for i in range(i, len(left)): 
       buff.append(left[i]) 
      break 

が最後では、このマージ関数が返す「数」;逆転の数。

エラーから判断すると、「左」などが整数として解釈されているため、添え字エラーが発生しているようです。しかし、私はちょうど彼らがリストであるべきであるときに、彼らがintである理由を理解することができません(または、おそらく私は何かを非常に明白に見逃しています)。

私はちょうどこれの周りに私の頭を得ることができません。すべての助けをいただければ幸いです! :)私はあなたのコードを見てきました

+4

ここにコードを投稿 –

+0

ここに再編成コードを直接貼り付けてください。テキストとして。それが長い場合は、問題を示す最小限の例を作成する必要があります。 – Carcigenicate

+0

申し訳ありませんここに新しい。私はそれを編集しました。ありがとう:) –

答えて

0

、およびmerge機能であなたは再帰で配列として再びmergeに渡し、その後タイプintの変数countを返すとしています。 したがってブロックif left[i] < right[j]:は機能しません。

mergeを変更すると、buff変数が返されます。

+0

ああsh * tええ!ありがとう、私はそれを実現しました、どのように私はすべての再帰の手順に失敗しています。私はこれを書いている間にちょうど2レベルの再帰ツリーを想像していました、そして、私は途中で再帰を考えなかったのです! –

+0

ようこそ。私はこれを[リンク](http:// stackoverflow。com/questions/19072004/understanding-the-recursion-of-mergesort)を使用すると、プロセスを視覚化するのに役立ちます。 –

+0

ああ、素晴らしい!もう一度ありがとう! :) –

関連する問題