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