Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的合并排序-`int`对象不可编辑_Python_Algorithm_Mergesort - Fatal编程技术网

Python中的合并排序-`int`对象不可编辑

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

下面是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[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(…)
to
sorted\u arr=merge\u sort(…)return sorted\u arr
因此它不会每次返回时都打印
sorted\u arr

包括完整的回溯。它有一些重要的东西,比如有错误的行。也就是说,它看起来像是在调用
extend()<清单>的元素。您可能想使用<代码> .AppEnter()/代码> .@ Cyphase >代码>附录< /Cult>已经工作,现在错误是“代码>列表索引超出范围 @ USEL2412502。您可能想考虑数组(左、右)的长度是什么,当你向下重复时,问问自己索引(左,右)的值。可以根据您循环
的次数为i…
感谢您的回答。
append
确实有效,现在错误是
列表索引超出范围
对,这是另一个问题。用just
merge=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