【问题标题】:python:list index out of rangepython:列表索引超出范围
【发布时间】:2021-03-14 13:22:55
【问题描述】:

我的代码是:

def my_sort(list):
    for _ in list:
        if list[0] > list[1]:
            list[0], list[1] = list[1], list[0]
    return my_sort(list[1:2])

但我不断收到此错误: IndexError: 列表索引超出范围

在这一行:if list[0] > list[1]:

这是我正在使用的测试代码:

   def test_my_sort():
lst_test = random.choices(range(-99, 100), k=6)
lst_copy = lst_test.copy()
lst_output = my_sort(lst_test)

assert lst_copy == lst_test, "Fout: my_sort(lst) verandert de inhoud van lijst lst"
assert lst_output == sorted(lst_test), \
    f"Fout: my_sort({lst_test}) geeft {lst_output} in plaats van {sorted(lst_test)}"

【问题讨论】:

  • 首先:list 是一个非常糟糕的变量名称,因为您覆盖了内置的 list。第二:您确定您的列表中至少有两个元素(提示:list[1:2])?
  • 1- 不要使用list 作为变量名,因为它是保留字。 2-不要分配list[0], list[1] = list[1], list[0]。这可能无法如您所愿。 3-您正在返回my_sort([1:2]),这导致了您的问题。您需要返回0:2。
  • 在您的 for _ in list: 行之前执行 print(list) 并与我们分享输出
  • 你能解释一下这个函数应该做什么吗?
  • @Matthias 递归冒泡排序

标签: python indexing


【解决方案1】:

您的问题源于这一行:

return my_sort(list[1:2])

在python中,我们从0而不是1开始索引。所以这转化为“索引 1 到 2”。您“停止”的索引不包括在内,因此您的语法变为“给我索引 1”。正确的解决方案是:

return my_sort(list[0:2])

或者更好:

return my_sort(list[:2])

因为这里的空意味着从头开始。

编辑: 我还没有解决你的递归问题,我只解决了你的列表索引问题。不过,请查看this solution for a recursive bubble sort。

【讨论】:

  • 你试过了吗?你没有收到RecursionError吗?
  • 谢谢,但如果我这样做,它表示我已经达到了 981 的递归限制,这有点奇怪,因为我的列表的最大长度为 6
  • @Matthias 不,我只是解决了他的问题,没有解决他的递归问题。
  • @PascalVos 是的,这是正确的,因为您没有理由停下来。所有递归函数都需要一个停止条件。
  • @PascalVos 你的问题并没有用这个答案解决。这会使用相同的两个元素一次又一次地调用您的函数。
猜你喜欢
  • 2015-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多