【问题标题】:indexError:list index out of rangeindexError:列表索引超出范围
【发布时间】:2016-06-25 08:05:03
【问题描述】:

该程序用于使用重复键进行快速排序。代码完美运行一次或两次,然后即使列表不为空,下次也会给出 IndexError。当我打印索引时它们位于范围内。这是我的问题吗具体是电脑?

EDIT-添加回溯

import random


def partition(n,lo,hi):
    i=lo
    lt=lo    #index showing the start of all duplicate partitioning keys
    gt=hi    #index showing the end of all duplicate partitioning keys
    x=n[lt]

    while(i<=gt):
        while(n[i]<=n[lt] and i<=gt):
            if(x!=n[lt]):
                print("alert!!!")
            if(n[i]<n[lt]): #current alement not a duplicate of partitioning alement
                if(lt<=i):
                    n[lt],n[i]=n[i],n[lt]
                    #print(n)
                i+=1
                lt+=1
            else: #current element is a duplicate partitioning alement
                #print(n[i],"=",n[lt])
                i+=1

        while(n[gt]>n[lt] and i<=gt):
            gt-=1

        if(i<gt):
            n[i],n[gt]=n[gt],n[i]
            gt-=1
            #print(n)


    return gt



def quickSort(n,lo,hi):
    #print("called")
    if(lo<hi):
        print(n)
        p=partition(n, lo, hi)
        quickSort(n, lo, p-1)
        quickSort(n, p+1, hi)

def main():
    nums=[]
    for i in range(30):
        nums.append(random.randrange(100))
    print("original array")
    print(nums)
    k=4
    hi=len(nums)-1
    #print(k,"th lowest number is ",quickSelect(nums, 0,hi,k))
    print(nums)
    quickSort(nums,0,hi)
    print(nums)

if __name__ == "__main__":
    main()  

追溯:

Traceback (most recent call last):
  File "C:\Users\S.reddy\workspace\sorter\src\selector\quickSelect.py", line 59, in <module>
    main()   
  File "C:\Users\S.reddy\workspace\sorter\src\selector\quickSelect.py", line 55, in main
    quickSort(nums,0,hi)
  File "C:\Users\S.reddy\workspace\sorter\src\selector\quickSelect.py", line 43, in quickSort
    quickSort(n, p+1, hi)
  File "C:\Users\S.reddy\workspace\sorter\src\selector\quickSelect.py", line 41, in quickSort
    p=partition(n, lo, hi)
  File "C:\Users\S.reddy\workspace\sorter\src\selector\quickSelect.py", line 11, in partition
    while(n[i]<=n[lt] and i<=gt):
IndexError: list index out of range

【问题讨论】:

  • 电脑不可能有问题。
  • 请也发布回溯
  • n, lo, hi 的哪些值会导致问题?
  • @RoryDaulton 我不知道我打印的所有这些似乎都在范围内
  • 我猜这是一个短路问题(也就是说,你没有正确地短路,当你应该这样做时)。尝试使用and 颠倒您正在测试的条件的顺序:while(i&lt;=gt and n[i]&lt;=n[lt])。这样,如果i 大于gt(因此超出范围),它将在尝试查找n[i] 之前被注意到。

标签: python


【解决方案1】:

由于您在内部 while 循环中检查条件的顺序,您的代码有时会超出索引范围。

调试此类问题的最佳简单方法通常是将tryexcept 块添加到代码中,except 块打印出有用的诊断值。我在您的循环中使用了这种变体来解决问题:

try:
    while(n[i]<=n[lt] and i<=gt):
        if(x!=n[lt]):
            print("alert!!!")
        if(n[i]<n[lt]): #current alement not a duplicate of partitioning alement
            if(lt<=i):
                n[lt],n[i]=n[i],n[lt]
                #print(n)
            i+=1
            lt+=1
        else: #current element is a duplicate partitioning alement
            #print(n[i],"=",n[lt])
            i+=1
except IndexError:
    print(i, gt, len(n))
    raise

您会看到,在某些情况下,gt 将是 len(n) - 1i 将是 len(n)。在这种情况下,while(n[i]&lt;=n[lt] and i&lt;=gt): 中的第一个测试将引发IndexError,因为n[i] 不是有效索引。

相反,您应该按照其他顺序进行测试,i &lt;= gt 首先。如果该测试是Falseand 将“短路”并且不评估第二个测试,这将导致异常。所以:使用while i &lt;= gt and n[i] &lt;= n[lt]:(括号是不必要的,所以我已经删除了它们并将运算符中的术语隔开。有关Python样式的更多建议,请参阅PEP 8。)

【讨论】:

  • 感谢 try-except 构造,我不知道它在 python 中。
【解决方案2】:

问题在第 11 行:

    while(n[i]<=n[lt] and i<=gt):

您需要将其更改为:

    while(i<=gt and n[i]<=n[lt]):

因为python首先检查第一个条件(在这种情况下它是i

【讨论】:

    猜你喜欢
    • 2011-10-31
    • 2015-06-26
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    相关资源
    最近更新 更多