为什么这个错误"列表索引超出范围"?

时间:2017-04-23 08:40:48

标签: 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

为什么要把最大的没有。在列表的第一个位置给出索引超出范围的错误,否则它运行得很完美。我知道其他各种方法,如max和all,但我想纠正这个。

3 个答案:

答案 0 :(得分:1)

让我们专注于被问到的问题:

  

为什么选择最大的号码。在列表的第一个位置给出索引超出范围的错误,否则它运行得很好?

答案很简单:

索引ij位于开始01。如果列表中的第一个项目是最大的,则列表j中的每个项目都会增加1,这会导致索引超出列表中最后一项的范围。

如果最大项目不是第一项j将增加最多n-1次,其中n是列表k的长度,因此索引超出界限的错误无法“实现”。

这里有一个修复,没有改变使用这样的函数而不是max(k)来搜索最大值的错误“逻辑”:

def gr(k):
    i=0
    j=1
    for x in k:
        if j > len(k)-1:
            x=k[i]
            break
        if k[i]>k[j]:
            x=k[i]
            j+=1
        else: 
            x=k[j]
            i+=1
    print (x)

顺便说一下:在Stack Exchange上,他们为那些喜欢这类问题的人们创建https://codegolf.stackexchange.com

我们正处于Stack Overflow。

这里为了完整起见:

  

此功能无法始终在列表中找到最大值

挑战奇怪的是找到一个错误值的情况:):

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

我在评论中跟踪请求,以显示上述函数未提供正确的结果:

gr([1, 2, 3, 4, 5])
gr([4, 1, 7, 3, 9])

给出:

4
7

应该给5和9代替。

ADDENDUM 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)
  

不要采取上述认真,但不要笑! stackoverflow没有幽默!

ADDENDUM B:现在是解决方案的解决方案。以上所有代码,如果您只是丢弃所有不必要的语句和变量而只是为了产生混淆,可以表示如下:

def ki(k): 
    y=k[0]
    for x in k[1:]: 
        if x > y: y=x 
    print(y)

知道这一点你就认识到了真正的挑战:编写与上面的小部件完全相同的代码,但是体积庞大,令人困惑,并且难以理解它实际所做的事情......

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

以下实现避免了索引变量ij。 如果序列为空或仅包含一个元素,则不需要进行比较。如果 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

顺便说一下,这会重新构建内置max