Python中的合并排序-`int`对象不可编辑
下面是Python中的合并排序实现。调用Python中的合并排序-`int`对象不可编辑,python,algorithm,mergesort,Python,Algorithm,Mergesort,下面是Python中的合并排序实现。调用merge\u arrays()函数时,我收到错误int object not iterable。如有任何建议,将不胜感激 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[l
merge\u arrays()
函数时,我收到错误int object not iterable
。如有任何建议,将不胜感激
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
arr=[1,5,4,7,6,8,3,2,9]
def合并数组(左对齐右对齐):
已排序的\u arr=[]
左,右=0,0
对于范围(0,len(arr))内的i:
如果(\u arr\u left[左]<\u arr\u right[右]):
已排序的扩展(\u arr\u left[左])
左+=1
其他:
打印右[右],右
已排序的扩展(\u arr\u right[右])
右+=1
返回已排序的\u arr
def合并排序(_arr):
如果(len(_arr)这个特定的错误是因为您说的是排序数组.extend(_arr_left[left])
。您要求排序数组
将“iterable”的每个元素都附加到它上面
并不是真的可计算的,它只是\u arr\u left
中索引left
处的int值
如果不尝试
然后除外
并打印例外
,您将看到完整的堆栈跟踪,它将告诉您哪一行是错误的
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
文件“merge.py”,第27行,在
合并=合并\排序(arr)
文件“merge.py”,第22行,按merge\u排序
_arr\u left=合并排序(\u arr[:len(\u arr)/2])
文件“merge.py”,第22行,按merge\u排序
_arr\u left=合并排序(\u arr[:len(\u arr)/2])
文件“merge.py”,第25行,按merge\u排序
返回合并数组(左对齐右对齐)
文件“merge.py”,第9行,在merge_数组中
已排序的扩展(\u arr\u left[左])
TypeError:“int”对象不可编辑
因此,您可以看到问题从第9行开始。您还可以在认为出现异常之前插入import pdb;pdb.set_trace()
sorted_arr.extend(_arr_left[left])
sorted\u arr
是一个列表
\u arr\u left
是一个列表
left
是一个int
因此,问题是:
PS:您的代码可能有其他问题。正如其他答案所提到的,您需要将范围
更改为附加
。但是,正如您在评论中所说的,您得到的列表索引超出范围
错误,因为您正在迭代arr
的大小e> 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
while(len(\u arr\u left)>左)或(len(\u arr\u right)>右):
如果(len(\u arr\u left)>左)和(len(\u arr\u right)>右):
如果(\u arr\u left[左]<\u arr\u right[右]):
已排序的\u arr.append(\u arr\u left[左])
左+=1
其他:
已排序的\u arr.append(\u arr\u right[右])
右+=1
elif(len(左对齐)>左对齐):
已排序的\u arr.append(\u arr\u left[左])
左+=1
其他:
已排序的\u arr.append(\u arr\u right[右])
右+=1
正如您在上面的代码中所看到的,我们必须测试各种条件。如果两个子数组都包含元素,那么我们将它们相互比较,并根据值的计算将附加到排序的数组中。如果不是,那么我们将附加来自单个子数组的值。如果您使用的不是left
和right
,而是pop
,这样您就不必跟踪left
和right
最后,是代码的工作版本。您还需要修改
return merge\u sort(…)
tosorted\u arr=merge\u sort(…)return sorted\u arr
因此它不会每次返回时都打印sorted\u arr
包括完整的回溯。它有一些重要的东西,比如有错误的行。也就是说,它看起来像是在调用extend()<清单>的元素。您可能想使用<代码> .AppEnter()/代码> .@ Cyphase >代码>附录< /Cult>已经工作,现在错误是“代码>列表索引超出范围 @ USEL2412502。您可能想考虑数组(左、右)的长度是什么,当你向下重复时,问问自己索引(左,右)的值。可以根据您循环的次数为i…
感谢您的回答。append
确实有效,现在错误是列表索引超出范围
对,这是另一个问题。用justmerge=merge\u sort(arr)替换大的try
-块
单独运行,这样您就可以查看整个堆栈跟踪并找出错误所在。要获得程序的交互式帮助,您可能需要。删除try/except block
只会显示运行时错误
。我感谢您对聊天的建议,但我认为如果我可以尝试自己解决它会更好。:)谢谢你的回答<代码>追加
确实有效,现在错误是列表索引超出范围
就像您在中所说的那样,您可能已经。。。你的代码
>>> a = [1,2,3,4]
>>> a.append(5)
>>> a
[1, 2, 3, 4, 5]
>>>
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