这是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
答案 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_arr
是list
_arr_left
是list
left
是int
>>> 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
正如您在上面的代码中所看到的,我们必须测试各种条件。如果两个子数组都包含元素,那么我们会将它们相互比较,并append
到sorted_arr
,具体取决于值的评估。如果没有,则我们append
来自个人sub-arrays
的值。如果不是使用left
和right
,而是使用pop
,那么您将不会更加容易跟踪left
和right
最后,here是您的代码的工作版本。你还需要修改
return merge_sort(...)
到sorted_arr = merge_sort(...) return sorted_arr
所以每次返回时都不会打印sorted_arr