当前位置: 首页 > 知识库问答 >
问题:

Python 合并函数数组范围错误?

魏明亮
2023-03-14

我正在尝试合并两个列表,但出现错误。有人有想法吗?

下面是我的合并函数

 def mymerg(container, first_index, mid_index, last_index):
      left_list = container[:mid_index]
      right_list = container[mid_index:]
      i = 0
      j = 0
      for elem in range(first_index, last_index+1, 1):
           if left_list[i] <= right_list[j]:
                container[elem] = left_list[i]
                i = i + 1
           else:
                container[elem] = right_list[j]
                j = j + 1

这是我的排序函数,它在行my_Merge_Port(container,first_index,mid_index)中生成错误

    def mymgsor(container, first_index, last_index):
            if first_index < last_index:
                    mid_index = len(container)//2
                    mymgsor(container, first_index, mid_index)
                    mymgsor(container, mid_index+1, last_index)
                    mymerg(container, first_index, mid_index, last_index)

如果first_index,我也会收到这个错误

当我调用这个函数时,我使用mymgsor(sample_list,0,len(sample_list)-1)

共有1个答案

农均
2023-03-14

使用heapq.merge而不是实现您自己的。

>>> import heapq
>>> list(heapq.merge([1,3,5], [2,4,6,7,8]))
[1, 2, 3, 4, 5, 6, 7, 8]

使用heapq.merge:

>>> def mymgsor(container, first_index, last_index):
...     if first_index < last_index:
...         mid_index = (last_index+first_index) // 2
...         mymgsor(container, first_index, mid_index)
...         mymgsor(container, mid_index+1, last_index)
...         container[first_index:last_index+1] = heapq.merge(container[first_index:mid_index+1], container[mid_index+1:last_index+1])
...
>>> xs = [5,4,2,3,1]
>>> mymgsor(xs, 0, len(xs)-1)
>>> xs
[1, 2, 3, 4, 5]

下面的行总是产生相同的值;导致< code>mymgsor的无限递归:

mid_index = len(container)//2

mymerg计算索引错误。尝试以下操作:

def mymerg(container, first_index, mid_index, last_index):
    left_list = container[first_index:mid_index+1]   # copy only  first_index .. mid_index
    right_list = container[mid_index+1:last_index+1] # copy only mid_index+1 .. last_index
    i = 0
    j = 0
    for elem in range(first_index, last_index+1, 1):
        if left_list[i] <= right_list[j]:
            container[elem] = left_list[i]
            i += 1
            if i == len(left_list): # no more left
                container[elem+1:last_index+1] = right_list[j:]
                break
        else:
            container[elem] = right_list[j]
            j += 1
            if j == len(right_list): # no more right
                container[elem+1:last_index+1] = left_list[i:]
                break
 类似资料:
  • 本文向大家介绍dart函数范围,包括了dart函数范围的使用技巧和注意事项,需要的朋友参考一下 示例 Dart函数也可以匿名声明或嵌套声明。例如,要创建嵌套功能,只需在现有功能块中打开一个新功能块 该函数innerFunction现在可以在内部使用,并且只能在内部使用outerFunction。没有其他任何功能可以访问它。 Dart中的函数也可以匿名声明,通常用作函数参数。一个常见的例子是对象so

  • 问题内容: 我需要一个与一系列gui事件几乎完全相同的回调函数。该函数的行为会有所不同,具体取决于调用该事件的事件。对我来说,这似乎是一个简单的案例,但是我无法弄清楚函数的这种奇怪行为。 因此,我在下面有以下简化代码: 此代码的输出是: 我期望: 为什么使用迭代器搞砸了? 我试过使用Deepcopy: 但这有同样的问题。 问题答案: 这里的问题是m变量(参考)来自周围的范围。仅参数保留在范围中。

  • 问题内容: 在Python中,有没有一种方法可以获取可以使用的最大整数?是否有一些像INT_MAX这样的预定义常量? 问题答案: Python具有任意精度的整数,因此没有真正的固定最大值。您仅受可用内存的限制。 在Python 2中,有两种类型,int和long。ints使用C类型,而longs是任意精度。您可以使用查找最大值int。但是int会自动将提升为long,因此您通常不必担心: 工作正常

  • 问题 你想定义一个数组的范围。 解决方案 在 CoffeeScript 中,有两种方式定义数组元素的范围。 myArray = [1..10] # => [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ] myArray = [1...10] # => [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ] 要想反转元素的范围,则可以写成下面这样。 myLargeArray =

  • 问题内容: 我已经声明了我的数组 然后我初始化它的值像 在运行时,它给出错误“数组索引超出范围” 问题答案: 正如评论员@C_X和@MartinR所说,您的数组为空。这是根据需要初始化的方法… …当然,如果您只想零,那么循环现在是多余的!

  • 问题内容: 尝试此计算时出现溢出错误,但我不知道原因。 问题答案: 您要求math.exp计算的数字以十进制表示,超过110,000个数字。这稍微超出了double的范围,因此会导致溢出。