(TypeError: не удается распаковать не итерируемый объект int) для счетчика инверсий с использованием сортировки слиянием

#python

#python

Вопрос:

Я пытаюсь выполнить рекурсивный вызов для подсчета количества инверсий списка чисел

например: [3,1,2,4] Две инверсии — это (3,1) и (3,2) .

Таким образом, алгоритм должен возвращать 2.

Я попробовал это с помощью метода merge_sort .

 

def merge(x,y,last_inversion_sum):
    x_length = len(x)
    y_length = len(y)
    n = x_length y_length
    i=j=0
    inversion = 0
    merged_list = []
    while i<x_length and j <y_length:
        if x[i]>y[j]:
            merged_list.append(y[j])
            j =1
        else:
            merged_list.append(x[i])
            i =1
            inversion =1

    if i == x_length:
        merged_list.extend(y[j:])
    else:

        merged_list.extend(x[i:])

    inversion = inversion last_inversion_sum
    return merged_list,inversion


def compute_inversion(a):
    array_length = len(a)
    if array_length<=1: return 0

    L,inversion1 = compute_inversion(a[:int(array_length / 2)])
    R,inversion2 = compute_inversion(a[int(array_length / 2):])
    inversion_sum = inversion1 inversion2

    return merge(L,R,inversion_sum)

lizt = [3,2,1,5]

_,inversion_num = compute_inversion(lizt)
print(inversion_num)
 

Выскочила ошибка:

 Traceback (most recent call last):
  File "D:/A.LXR/inversion.py", line 40, in <module>
    _,inversion_num = compute_inversion(lizt)
  File "D:/A.LXR/inversion.py", line 32, in compute_inversion
    L,inversion1 = compute_inversion(a[:int(array_length / 2)])
  File "D:/A.LXR/inversion.py", line 32, in compute_inversion
    L,inversion1 = compute_inversion(a[:int(array_length / 2)])
TypeError: cannot unpack non-iterable int object

Process finished with exit code 1
 

Где что-то пошло не так?
Кто-нибудь может мне помочь?

Комментарии:

1. вы возвращаете int объект, а не кортеж, когда array_legnth <= 1 , следовательно, при его распаковке вы получаете эту ошибку

2. почему вы вызвали функцию compute_inversion внутри нее?

Ответ №1:

Ваша функция compute_inversion(a) всегда должна возвращать значения одного и того же типа, список и int, даже когда array_length<=1:

Вы могли бы сделать это так:

 def compute_inversion(a):
    array_length = len(a)
    if array_length<=1: return a, 0

    L,inversion1 = compute_inversion(a[:int(array_length / 2)])
    R,inversion2 = compute_inversion(a[int(array_length / 2):])
    inversion_sum = inversion1 inversion2

    return merge(L,R,inversion_sum)
 

Теперь это работает, и результат :

 3