python 为什么我会得到一个列表索引超出范围的错误,其中条目的长度为四位数?

ruyhziif  于 2023-04-04  发布在  Python
关注(0)|答案(2)|浏览(129)

我写了这个算法,它使用操作对一个数字列表进行排序,返回最短的序列。通过总是颠倒列表的前n个元素的顺序并从列表中删除第一个元素来排序。

def wenden(arr, n):
    #dreht die Ersten n elemente um
    i = 0
    while i < n // 2:
        arr[i], arr[n - i-1] = arr[n - i-1], arr[i]
        i += 1
    arr.pop(0)
    return arr

def ist_Sortirt(arr):
    for i in range(len(arr) - 1):
        if arr[i] > arr[i+1]:
            return False
    return True

def best_sort(arr):
    flips = []
    if not ist_Sortirt(arr):
        for i in range(1, len(arr)-1):
            sort_lis = wenden(arr, i + 1)
            flipi = [i+1]
            flipi.append(best_sort(sort_lis))
            flips.append(flipi)
        ret = 0
        for i in range(1, len(flips)-1):
            if len(flips[i]) < len(flips[ret]):
                ret = i
        return flips[ret]
    else:
        return []

我已经测试了脚本与不同的输入列表,一个列表的短语应该输出,但我总是得到一个列表索引范围外的错误在return flips[ret]best_sort()如果输入长于3个数字
输入:[2,1,3,6]

Traceback (most recent call last):
  File "D:\programming\Aufgabe3a.py", line 69, in <module>
    print(best_sort(pfannkuchen))
  File "D:\programming\Aufgabe3a.py", line 47, in best_sort
    flipi.append(best_sort(sort_lis))
  File "D:\programming\Aufgabe3a.py", line 53, in best_sort
    return flips[ret]
IndexError: list index out of range
xmjla07d

xmjla07d1#

我解决了这个问题。现在试试。
改变best_sort中的循环范围,而不是从1循环到len(arr)- 1,你应该从0循环到len(arr),以避免索引超出范围错误。

def wenden(arr, n):
    i = 0
    while i < n // 2:
        arr[i], arr[n - i - 1] = arr[n - i - 1], arr[i]
        i += 1
    arr.pop(0)
    return arr

def ist_Sortirt(arr):
    for i in range(len(arr) - 1):
        if arr[i] > arr[i + 1]:
            return False
    return True

def best_sort(arr):
    if len(arr) <= 1:
        return []

    flips = []

    if not ist_Sortirt(arr):
        for i in range(len(arr)):
            sort_lis = copy.deepcopy(arr)
            sort_lis = wenden(sort_lis, i + 1)
            flipi = [i + 1]
            flipi.append(best_sort(sort_lis))
            flips.append(flipi)

        ret = 0
        for i in range(1, len(flips)):
            if len(flips[i]) < len(flips[ret]):
                ret = i
        return flips[ret]
    else:
        return []
gzjq41n4

gzjq41n42#

def best_sort(arr):
    flips = []
    if not ist_Sortirt(arr):
        for i in range(1, len(arr)-1):
            sort_lis = wenden(arr, i + 1)
            flipi = [i+1]
            flipi.append(best_sort(sort_lis))
            flips.append(flipi)
        ret = 0
        for i in range(1, len(flips)-1):
            if len(flips[i]) < len(flips[ret]):
                ret = i
        return flips[ret]

最终,代码到达arr只有两个元素的位置。
所以循环for i in range(1, len(arr)-1)变成了for i in range(1, 1),根本不执行,因此没有任何元素被追加到flips,因此flips[ret]超出了范围。

相关问题