2016-09-14 6 views
0

Привет Я новичок в python, и у меня возникают проблемы с проблемой обращения к счету с помощью mergesort. Ошибка говорит, что объект «int» не является итерируемым. Однако я не думаю, что на этом этапе я повторяю любое число. Поскольку я застрял здесь, я не уверен, что в этом коде есть больше ошибок. Может кто-нибудь помочь мне выяснить, что происходит здесь, спасибоПодсчет инверсии в python: int object 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. Например, для данных = [1, 2, 3, 4, 5] имеем n, * a = 1, [2,3,4,5]. –

+0

Проблема может быть в операторе return в функции 'get_number_of_inversions()': 'return number_of_inversions'. Я думаю, что это может быть 'return number_of_inversions, []'. – acw1668

+0

Да, я думаю, это моя проблема, теперь я решил это, спасибо! –

ответ

1

Ну, я не разбираюсь в алгоритме сортировки слиянием, но в get_number_of_inversions() вы имеют два выхода:

Первый:

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

И:

return tot_inversions, sorted_list 

Вы можете использовать возвращаемые значения в выражении, как:

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

Так иногда возвращают целое число, а иногда кортеж. Я предполагаю, что когда вы возвращаете целое число, вы получаете эту ошибку.

+0

Да, та же ошибка возникает при помощи 'a, b = 3'. –

+0

Назначение Tuple требует, чтобы итерабельность была распакована в 'a, b = 3', которую вы пытаетесь распаковать в integer. –