错误消息"列表索引超出范围"

时间:2014-06-10 10:52:15

标签: python list python-3.x

def third_largest(a):
    count = 0
    b = 0
    while count < 2 or count > 2:
        for i in range(0,len(a)-1):
            if a[b] < a[i]:
                count += 1
        b += 1
    print(a[b])

我希望获得列表中的第三大数字。

首先,我选取第一个元素并与所有其他元素进行比较,然后在count等于2时选取第二个元素,然后打印出我的答案。

但为什么我在'list index is out of range'循环中收到错误消息for?我真的很困惑。

3 个答案:

答案 0 :(得分:2)

print循环中添加for

def third_largest(a):
    count = 0
    b = 0
    while count < 2 or count > 2:
        for i in range(0,len(a)-1):
            print("b: {0}, count: {1}, i: {2}".format(b, count, i))
            if a[b] < a[i]:
                count += 1
            else:
                count += 0
        b += 1
    print(a[b])

我们可以确切地看到问题所在:

>>> third_largest([1, 2, 3])
b: 0, count: 0, i: 0
b: 0, count: 0, i: 1
b: 1, count: 1, i: 0
b: 1, count: 1, i: 1
b: 2, count: 1, i: 0
b: 2, count: 1, i: 1
b: 3, count: 1, i: 0

Traceback (most recent call last):
  File "<pyshell#11>", line 1, in <module>
    third_largest([1, 2, 3])
  File "<pyshell#10>", line 8, in third_largest
    if a[b] < a[i]:
IndexError: list index out of range

您没有进行任何检查以确保ba范围内的索引。

此外,您可以使用while count != 2:并注意count += 0完全没有意义。还有一种更简单的方法可以解决这个问题( 提示 :如果a按顺序排列,第三大值会在哪里?< / em>的)

答案 1 :(得分:2)

def third_largest(a):
    if len(a) < 3:
        raise ValueError
    # Sort array, smalles ahead, and return item on index -3
    return sorted(a)[-3]

使用pythons自己的方法,现在你确定你有正确的号码

答案 2 :(得分:0)

复杂比复杂更好。

def third_largest(a):
    if len(a)>2: return list(set(sorted(a)))[-3]
    return -1