索引错误:列表索引超出python代码范围

时间:2012-08-25 09:24:37

标签: python

这是我用于合并排序的Python代码,我无法理解为什么我在第23行得到IndexError

第23行如果放在for循环之前但在for循环中显示为list index out of range,则不会出错。 :(

from math import floor

def merge_sort(a,p,r):
 if p < r:
  q = (p+r)/2
  merge_sort(a,p,q)
  merge_sort(a,q+1,r)
  merge(a,p,q,r)

def merge(A,p,q,r):
 n1 = q - r +1
 n2 = r - q
 L = []
 R = []
 #print n1
 for i in range (1,n1):
  L.append(a[p+i-1])
 for j in range (1,n2):
  R.append(a[q+j])
 L.append(10000)
 R.append(10000)
 i,j=0,0

 for k in range (p,r):
  if L[i] <= R [j]: # This is where the error occurs
   A[k] = L[i]
   i = i + 1
  else :  
   A[k] = R[j]
   j = j + 1



a=[1,4,9,8,2,3,8,2,9]
merge_sort(a,1,len(a)) 
print a

2 个答案:

答案 0 :(得分:0)

这不是python,这是带有Python语法的Pascal。

以下是合并排序算法的实现(基于Merge sort wiki article):

def merge_sort(data):
    if len(data) <= 1:
        return data

    middle = len(data) / 2

    left = merge_sort(data[0:middle])
    right = merge_sort(data[middle:])

    return merge(left, right)


def merge(left, right):
    result = []

    while left or right:
        if left and right:
            if left[0] <= right[0]:
                result.append(left.pop(0))
                continue

            result.append(right.pop(0))
            continue

        if left:
            result.append(left.pop(0))
        elif right:
            result.append(right.pop(0))

    return result


data = [1, 4, 9, 8, 2, 3, 8, 2, 9]
result = merge_sort(data)

assert len(data) == len(result)

print result

答案 1 :(得分:0)

我同意评论者/其他海报,这个脚本有一个Python语法(除了不是习惯性的4个空格的缩进......)但是来自Pythonic ...

无论如何,对于您的问题:merge(p,q,r)=(1,2,3)中出现问题。在这种情况下,n1=0n2=1。循环range(1,n1)将无法获取任何内容,因此您的L将只有1个元素(您在循环外附加10000)。

现在,当你到达for k in range (p,r)循环:

  • 在第一次迭代时,k=p=1L[0] <= R[0]并将1添加到i,因此i = 1
  • 在第二次迭代中,您尝试访问未定义的L[i],即L[1]。因此,IndexError

一些建议:

  • 了解如何使用调试器。很多IDE都带有一些实现,它确实有帮助。
  • 请记住,列表以索引0开头。当你来自另一种语言时,你会忘记它。