Python中的合并排序 - “int”对象不可迭代

时间:2015-09-06 04:13:54

标签: python algorithm mergesort

这是Python中的合并排序实现。调用int object is not iterable函数时,我收到错误merge_arrays()。任何建议都将受到高度赞赏。

arr = [1,5,4,7,6,8,3,2,9]

def merge_arrays(_arr_left, _arr_right):
    sorted_arr = []
    left, right = 0, 0

    for i in range(0, len(arr)):
        if (_arr_left[left] < _arr_right[right]):
            sorted_arr.extend(_arr_left[left])
            left += 1
        else:
            print _arr_right[right], right
            sorted_arr.extend(_arr_right[right])
            right += 1

    return sorted_arr

def merge_sort(_arr):
    if (len(_arr) <= 1):
        return _arr

    _arr_left = merge_sort(_arr[:len(_arr)/2])
    _arr_right = merge_sort(_arr[(len(_arr)/2):])

    return merge_arrays(_arr_left, _arr_right)

try:
    merge = merge_sort(arr)
    print merge
except Exception as e:
    print e

3 个答案:

答案 0 :(得分:2)

这个特定的错误来自你说sorted_array.extend(_arr_left[left])的事实。您要求sorted_array将“可迭代”_arr_left[left]的每个元素附加到其上。但是_arr_left[left]不是真正可迭代的,它只是left中索引_arr_left处的int。

如果你没有try然后except并打印Exception,你会看到一个完整的堆栈跟踪,告诉你哪条线是坏的。

  File "merge.py", line 27, in <module>
    merge = merge_sort(arr)
  File "merge.py", line 22, in merge_sort
    _arr_left = merge_sort(_arr[:len(_arr)/2])
  File "merge.py", line 22, in merge_sort
    _arr_left = merge_sort(_arr[:len(_arr)/2])
  File "merge.py", line 25, in merge_sort
    return merge_arrays(_arr_left, _arr_right)
  File "merge.py", line 9, in merge_arrays
    sorted_arr.extend(_arr_left[left])
TypeError: 'int' object is not iterable

因此,您可以看到问题从第9行开始。您还可以在认为异常出现以运行python debugger之前插入import pdb; pdb.set_trace()并逐步执行程序的进展以查看异常出现的位置

答案 1 :(得分:0)

在第9行:

sorted_arr.extend(_arr_left[left])
  • sorted_arrlist
  • _arr_leftlist
  • leftint

所以,问题是:

>>> a = [1,2,3,4]
>>> a.extend(5)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'int' object is not iterable
>>>

解决方案:

您可以使用list.append()代替extend()

>>> a = [1,2,3,4]
>>> a.append(5)
>>> a
[1, 2, 3, 4, 5]
>>>

PS:您的代码可能还有其他问题。

答案 2 :(得分:0)

正如其他答案所提到的,您需要将extent更改为append。但是,正如您在评论中所说,您收到list index out of range错误,因为您正在迭代size arr 9,但子数组的长度要小得多。尝试将两个数组合并代码更改为以下内容。

while (len(_arr_left) > left) or (len(_arr_right) > right):
        if (len(_arr_left) > left) and (len(_arr_right) > right):
            if (_arr_left[left] < _arr_right[right]):
                sorted_arr.append(_arr_left[left])
                left += 1
            else:
                sorted_arr.append(_arr_right[right])
                right += 1
        elif (len(_arr_left) > left):
            sorted_arr.append(_arr_left[left])
            left += 1
        else:
            sorted_arr.append(_arr_right[right])
            right += 1

正如您在上面的代码中所看到的,我们必须测试各种条件。如果两个子数组都包含元素,那么我们会将它们相互比较,并appendsorted_arr,具体取决于值的评估。如果没有,则我们append来自个人sub-arrays的值。如果不是使用leftright,而是使用pop,那么您将不会更加容易跟踪leftright

最后,here是您的代码的工作版本。你还需要修改 return merge_sort(...)sorted_arr = merge_sort(...) return sorted_arr所以每次返回时都不会打印sorted_arr