2016-09-14 5 views
0

こんにちは私はPythonには新しいですが、私はmergesortを使ってカウントの反転問題に問題があります。エラーは、 "" int "オブジェクトはiterableではないと言いました。しかし、私はこの段階で何回も反復しているとは思っていません。私はここにくっついているので、このコードにもっと多くのバグがあるかどうかはわかりません。私はここで何が起こっているかを考え出す助けどうもありがとうございましPythonで逆転をカウントする:intオブジェクトnot iterable error

import sys 

def merge_and_count_inversions(x, y): 
    sorted_array = [] 
    count = 0 
    i, j = 0, 0 
    #print ("inside merge", x, y) 
    while i < len(x) and j < len(y): 
     if x[i] > y[j]: 
      count += len(x) - i 
      sorted_array.append(y[j]) 
      j += 1 
     else: 
      sorted_array.append(x[i]) 
      i += 1 
    while i < len(x): 
     sorted_array.append(x[i]) 
     i += 1 
    while j < len(y): 
     sorted_array.append(y[j]) 
     j += 1 
    #print ("overall count = ", count) 
    #print ("sorted_array", sorted_array) 
    return count, sorted_array 

def get_number_of_inversions(a, b, left, right): 
    number_of_inversions = 0 
    if right - left <= 1: 
     return number_of_inversions 
    ave = (left + right) // 2 
    number_of_inversions_A, a[left:ave] = get_number_of_inversions(a, b, left, ave) 
    #print ("left list", a[left : ave]) 
    #print ("number_of_inversions left half = ", number_of_inversions) 
    number_of_inversions_B, a[ave:right] = get_number_of_inversions(a, b, ave, right) 
    #print ("right list", a[ave : right]) 
    #print ("number_of_inversions left + right half = ", number_of_inversions) 
    number_of_inversions_C, sorted_list = merge_and_count_inversions(a[left:ave],a[ave:right]) 
    tot_inversions = number_of_inversions_A + number_of_inversions_B + number_of_inversions_C 
    #print ("number_of_inversions overall = ", number_of_inversions) 
    return tot_inversions, sorted_list 

input_ = input() 
n, *a = list(map(int, input_.split())) #n is the length of a 
b = n * [0] 
get_number_of_inversions(a, b, 0, len(a)) 
print(get_number_of_inversions(a, b, 0, len(a))) 

、エラーが言った:?。

<ipython-input-60-e1f94361f38a> in get_number_of_inversions(a, b, left, right) 
    33  ave = (left + right) // 2 
    34  print ("average = ", ave) 
---> 35  number_of_inversions_A, a[left:ave] = get_number_of_inversions(a, b, left, ave) 
    36  print ("left list", a[left : ave]) 
    37  print ("number_of_inversions left half = ", number_of_inversions) 

<ipython-input-60-e1f94361f38a> in get_number_of_inversions(a, b, left, right) 
    33  ave = (left + right) // 2 
    34  print ("average = ", ave) 
---> 35  number_of_inversions_A, a[left:ave] = get_number_of_inversions(a, b, left, ave) 
    36  print ("left list", a[left : ave]) 
    37  print ("number_of_inversions left half = ", number_of_inversions) 

TypeError: 'int' object is not iterable 
+0

*ここでは、python3でリストを2つの部分に分割するために使用されています。たとえば、data = [1,2,3,4,5]の場合、n、* a = 1、[2,3,4,5]となります。 –

+0

問題は、関数 'get_number_of_inversions()':return number_of_inversions'のreturn文にある可能性があります。私はそれが 'return number_of_inversions、[]'かもしれないと思います。 – acw1668

+0

ええ、私はそれが私の問題だと思う、今私はそれを解決しました、ありがとう! –

答えて

1

は、まあ、私はマージソートアルゴリズムではなく、get_number_of_inversions()あなたが精通していませんよ2つの出口があります。

最初に:

number_of_inversions = 0 
if right - left <= 1: 
    return number_of_inversions 

とは:だから、時にはあなたは、整数、時にはタプルを返す

number_of_inversions_A, a[left:ave] = get_number_of_inversions(a, b, left, ave) 

return tot_inversions, sorted_list 

あなたは次のように表現して戻り値を使用します。私の推測では、整数を返すと、このエラーが発生します。

+0

はい、同じエラーが 'a、b = 3'によって発生します。 –

+0

タプルの割り当てには、整数でアンパックしようとしている 'a、b = 3'でアンパックするための反復可能性が必要です。 –