python列表被解释为整数;计数倒数

时间:2017-01-25 16:56:16

标签: python python-3.x mergesort divide-and-conquer

获取错误:

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

我的合并排序实现就是这样;接受一个列表及其长度。基本情况是当length为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

在完成所有递归调用之后,合并排序函数显然会调用此合并函数。

此合并函数中有if-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

最后,这个合并函数返回&#39; count&#39 ;;倒数。

从错误来看,似乎“离开了”。等被解释为整数,从而给我下标错误。但是我明白他们是什么时候才能明白他们应该是名单(或者我可能只是错过了一些非常明显的东西)。

我无法理解这一点。任何和所有的帮助表示赞赏! :)

1 个答案:

答案 0 :(得分:0)

我已经看到了您的代码,并且在merge函数中,您将返回类型为count的变量int,然后再将其作为数组传递给merge递归。 因此块if left[i] < right[j]:将不起作用。

更改merge函数以返回buff变量。