Python 为什么会出现这种错误;列表索引越界“;?

Python 为什么会出现这种错误;列表索引越界“;?,python,python-2.7,python-3.x,Python,Python 2.7,Python 3.x,如何在序列中找到最大的 k=[10,7,5,9,2] def gr(k): i=0 j=1 for x in k: if k[i]>k[j]: x=k[i] j+=1 else: x=k[j] i+=1 print x 为什么把最大的no.放在列表的第一个位置会给出索引越界错误,否则它运行得很好。我知道其他各种方法,比如max和a

如何在序列中找到最大的

k=[10,7,5,9,2]
def gr(k):
    i=0
    j=1
    for x in k:
        if k[i]>k[j]:
            x=k[i]
            j+=1
        else:
            x=k[j]
            i+=1
    print x

为什么把最大的no.放在列表的第一个位置会给出索引越界错误,否则它运行得很好。我知道其他各种方法,比如max和all,但我想纠正这个问题。

如果用1初始化
j
,for循环将执行
n次,
n
是数组的长度。考虑到第一个元素是最大的,根据您的代码,
j
将在每次迭代中递增

因此在上一次迭代中,
j
将增加
n-1
次,现在等于
n


由于数组的索引从0开始,因此有效的索引范围是从0到
n-1

让我们集中讨论一下问题:

为什么将最大的编号放在列表的第一个位置会给出索引越界错误,否则它运行得很好

答案很简单:

索引
i
j
位于起始
0
1
。如果列表中的第一个项目是最大的,则对于列表中的每个项目,
j
增加1,这将导致列表中最后一个项目的索引超出范围

如果最大项不是第一项,
j
将增加一个最大
n-1
倍,其中
n
是列表的长度
k
,因此无法“实现索引越界错误”

在不改变不良“逻辑”的情况下,使用此函数而不是
max(k)
搜索最大值的修复方法如下:

顺便说一句:在堆栈交换上,他们为那些喜欢这类问题的人创建的

我们正处于堆栈溢出状态

为了完整起见,这里:

此函数无法始终在列表中找到最大值

是什么挑战了好奇者找到一个案例?它返回了一个错误的值:)

(如果愿意,您可以在下面的评论中提供此挑战的“解决方案”)

我遵循评论中的要求,以显示上述功能何时无法提供正确的结果:

给出:

4
7
应该改为5和9。

附录A:受评论中帖子的启发,我进一步改进了评论中最后一个功能的改进版本,因此它现在正确地涵盖了所有可能的情况:

def ki(k): 
    i=0
    j=1 
    y=k[j-1]
    for x in k: 
        if i > i + j: 
            y=k[i] 
            break 
        if k[j] > y: 
            y=k[j] 
            i+=2 
        else: 
            x=k[j-1] 
            i+=3
        i-=1
        j+=1
        if j > len(k)-1:
            break
    if x < x - j: 
        print(x)
    else: 
        print(y)

知道了这一点,您就认识到了实际的挑战:编写与上面的小片段完全相同的代码,但其内容非常庞大、混乱,并且尽可能难以理解它的实际功能……

以下实现避免了索引变量
i
j
。 如果序列为空或仅包含一个元素,则不需要进行比较。如果n是序列的长度,则比较次数为n-1。因此,实现从第二个元素开始循环

我已将打印移到功能之外

k = [10, 7, 5, 9, 2]

def gr(k):
    if not k:
        return None

    if len(k) == 1:
        return k[0]

    result = k[0]
    for x in k[1:]:
        if x > result:
            result = x

    return result

print(gr(k))
结果:

10

BTW,这将重新生成Buffix<代码> max 。

在循环中,您正在改变循环变量<代码> x>代码>的值,这从来不是一个好主意。同时给出有意义的变量名,以便您的意图变得更加清晰。重新发明
max()
?不!只是想弄清楚它是如何工作的。查看我的更新答案,了解关于你问题的一个小的额外挑战。你能建议解决方案吗?不改变方法。我知道其他方法,比如使用Reduce函数。你的算法实际上不正确。您能解释一下为什么要递增
i
j
?要找到最大的数字,只需跟踪到目前为止最大数字的索引即可。例如,您可以使用0初始化该索引,然后在数组上迭代,每当您发现一个元素大于“迄今为止最大的索引”中的元素时,您就会更新“迄今为止最大的索引”。在迭代结束时,您只需返回“到目前为止最大的索引”处的元素。Thanx用于解决方案加上嘲讽。我知道MAX、Reduce和其他各种方法来实现这一点,smarty先生。当列表中有连续序列时。已经回答了您的挑战……以下是def gr(k)的解决方案:i=0 j=1 x in k:if j>len(k)-1:x=k[i]break if k[i]>=k[j]:x=k[i]y=k[j]j+=1 else:y=k[j]i+=1 if x>y:print x else:printy@shivamsr. 您提供的更新代码不是问题的解决方案,即函数无法提供正确的结果。它解决了提供的第一个序列的问题,但没有解决第二个
gr([4,1,7,3,9])
的问题,因为它仍然将7作为错误的结果提供。这样的算法根本不适合搜索最大值…def hr(k):i=0 j=1 y=k[j-1]x in k:if k[j]>y:y=k[j]否则:如果j>len(k)-1:break print y
返回k[0]
“破坏”了代码的错误逻辑,因此不是真正正确的修复方法。。。
def ki(k): 
    y=k[0]
    for x in k[1:]: 
        if x > y: y=x 
    print(y)
k = [10, 7, 5, 9, 2]

def gr(k):
    if not k:
        return None

    if len(k) == 1:
        return k[0]

    result = k[0]
    for x in k[1:]:
        if x > result:
            result = x

    return result

print(gr(k))
10