2017-01-25 5 views
-2

Получения ошибка:Список python интерпретируется как целое число; Подсчет инверсии

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

Моя реализация сортировки слияния, как это; принимает список и его длину. Базовый случай, когда длина 1, где я просто возвращает список (не как межд, но в виде списка):

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 

Эта функция слияния, очевидно, называется функцией сортировки слиянием после того как все рекурсивные вызовы выполняются.

Есть ли-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 

В конце концов, эта функция слияния возвращает «количество»; количество инверсий.

Судя по ошибке, кажется, что «left» и т. Д. Интерпретируются как целые числа, что дает мне ошибку индекса. Но я просто не могу понять, ПОЧЕМУ они являются ints, когда ясно, что они должны быть списками (или, может быть, я просто пропустил что-то очень очевидное).

Я просто не могу обдумать это. Любая помощь приветствуется! :)

+4

напишите свой код здесь –

+0

Вставьте здесь реорганизованный код; как текст. Если это долго, вам нужно создать минимальный пример, демонстрирующий вашу проблему. – Carcigenicate

+0

Извините! Новенький тут. Я отредактировал его. Спасибо :) –

ответ

0

Я видел ваш код, и в merge функции вы возвращенная переменную count типа int, а затем передать его в merge снова как массив в рекурсии. Так что блок if left[i] < right[j]: не будет работать.

Изменение merge функция для возврата buff переменная.

+0

ах sh * t да! Большое спасибо, я только что понял это, как я проваливаю все шаги рекурсии. Я представлял себе всего лишь 2-х рекуррентное дерево, когда писал это, и я никогда не думал о рекурсиях посередине! –

+0

Добро пожаловать. Я думаю, что это [ссылка] (http: // stackoverflow.com/questions/19072004/understanding-the-recursion-of-mergesort) поможет вам визуализировать процесс. –

+0

О, потрясающе! Еще раз спасибо ха-ха! :) –