为什么python list显示切片异常?

我试图递归地对列表元素进行分区(如在分而治之),并因此打印切片的元素,但突然看到意外的异常(在输出的第6行及以后)。

def Mergesort(a,l,r):
    if(l<r):
      mid = (r+l+1) // 2
      print(a)
      Mergesort(a[l : mid],mid-1)
      Mergesort(a[mid : r+1],mid,r)

a = [8,3,-2,6,7,4,1,2,-1,9,12,11,5] 
Mergesort(a,len(a)-1)

输出:

[8,5]
[8,1]
[8,-2]
[3,-2]
[6,1]
[1]
[]
[2,5]
[]
[]
[]
[]
[]
owihs 回答:为什么python list显示切片异常?

这是因为您在l,r中的def Mergesort不准确。当您合并RHS阵列a=[2,-1,9,12,11,5]时,它实际上正在运行:Mergesort([2,5],7,10),而不是Mergesort([2,3)。由于len(a)= 7,它将仅返回一个空数组[]。 我修改了代码:

def Mergesort(a,l,r):
    if(l<r):
        mid = (r+l+1) // 2
        print (a)
   #    
        Mergesort(a[l : mid],len(a)-1)
        Mergesort(a[mid : r+1],len(a)-1)

a = [8,3,-2,6,4,1,2,5] 
Mergesort(a,len(a)-1)

现在,它可以同时拆分左右两个数组。如果您在print (a)子句中if,则输出:

[8,5]
[8,1]
[8,-2]
[8,-2]
[8]
[3,-2]
[3]
[-2]
[]
[6,1]
[6,4]
[6,7]
[6]
[7]
[4]
[1]
[]
[2,5]
[2,0]
[2,0]
[2]
[-1,0]
[-1]
[0]
[]
[9,5]
[9,11]
[9,12]
[9]
[12]
[11]
[5]
[]

请注意,代码仍然不是完美的并且需要工作(但是它解决了您提出的拆分问题),我建议改进

1)mid的定义,因此可以正确拆分偶数数组;

2)lr的定义,这样它就不会拆分单元素数组。

,

我找到了解决方案。实际上,在函数中传递切片列表时,索引从零开始。

本文链接:https://www.f2er.com/2625862.html

大家都在问