【问题标题】:Why does the for loop give an error in bubble sort? [duplicate]为什么 for 循环在冒泡排序中会出错? [复制]
【发布时间】:2021-09-26 14:25:48
【问题描述】:

我有一个代码:

l = [5, 8, 1, 3, 2]

still_swapping = True

while still_swapping:
    still_swapping = False
    for i in range(len(l)):
        print(l[i], i)
        if l[i] > l[i+1]:
            l[i], l[i+1] = l[i+1], l[i]
            still_swapping = True
print(l)

而且,我有输出:

    if l[i] > l[i+1]:
IndexError: list index out of range

我不明白为什么它超出了范围。请大家帮帮我好吗?

【问题讨论】:

  • 你在做for i in range(len(l)),所以i总是在列表的范围内,但i+1不在。
  • @khelwood 你能详细说明一下吗?
  • OK...好吧i 上升到列表中的最后一个位置。此时,显然i+1超过列表的末尾。所以没有l[i+1]这样的元素。
  • 所以,它试图找到一个不存在的元素,但是我该如何解决这个问题呢?如何停止搜索?
  • 您可以减少范围的上限。这样可以避免异常。

标签: python bubble-sort


【解决方案1】:

IndexError: list index out of range 当您尝试访问具有不在数组可用索引范围内的索引的元素时抛出。

例如,假设您有 10 桶水果,所有桶依次标记为 0、1、2....、9。所以你有每个桶的特定标识号。因此,最后一个桶的索引号为 total buckets-1,因为我们已将它们标记为从 0 开始,而不是 1。

所以如果你说带上最后一个桶,索引号将始终是total buckets-1。同样,如果您尝试访问索引号与总桶数相同的桶,那将是一个无效查询,因为您没有索引号与桶总数相​​同的桶,在我的示例中为 10。现在看:

for i in range(len(l)):

在这里,您从 0 循环到 len(l) - 1(这就是 range(int) 的工作方式),总共 l 次,这是数组的长度。现在,当您尝试处理最后一个索引号 len(l)-1 时,请在此特定行中:

if l[i] > l[i+1]:

您正在尝试访问条件右侧的索引len(l),与我的示例发生的情况相同,您正在访问超出范围的存储桶编号 10,因此抛出了 IndexError: list index out of range .

希望一切都清楚。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-05
    • 2012-08-28
    • 2015-09-12
    • 2021-02-06
    • 2020-09-13
    • 2011-03-17
    • 1970-01-01
    • 2019-02-26
    相关资源
    最近更新 更多