【问题标题】:Why is python list showing slicing abnormality?为什么python列表显示切片异常?
【发布时间】:2020-06-29 12:52:24
【问题描述】:

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

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

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

输出:

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

【问题讨论】:

  • 您的预期输出到底是什么?
  • [8, 3, -2, 6, 7, 4, 1, 2, -1, 0, 9, 12, 11, 5] [8, 3, -2, 6, 7 , 4, 1] [8, 3, -2] [3, -2] [6, 7, 4, 1] [6, 7] [4, 1] [2, -1, 0, 9, 12, 11, 5] [2, -1, 0] [-1, 0] [9, 12, 11, 5] [9, 12] [11, 5]

标签: python recursion divide-and-conquer


【解决方案1】:

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

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

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

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

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

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

1) mid 的定义使其正确分割偶数数组;

2) 定义lr 使其不会拆分单元素数组。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2013-10-24
      • 1970-01-01
      • 2011-03-23
      • 2020-09-16
      • 1970-01-01
      • 2017-06-19
      • 2017-06-24
      • 2015-02-19
      • 2014-05-13
      相关资源
      最近更新 更多