IndexError:列表赋值索引超出范围Python

时间:2016-01-22 22:43:14

标签: python list python-3.x indexof

def mode(given_list):
    highest_list = []
    highest = 0
    index = 0
    for x in range(0, len(given_list)):
        occurrences = given_list.count(given_list[x])
        if occurrences > highest:
            highest = occurrences
            highest_list[0] = given_list[x]
        elif occurrences == highest:
            highest_list.append(given_list[x])

代码用于计算给定列表的模式。我不明白我哪里出错了。

我收到的确切错误。

line 30, in mode
    highest_list[0] = given_list[x]
IndexError: list assignment index out of range

3 个答案:

答案 0 :(得分:1)

问题是你最初有一个空列表:

highest_list = []

然后在循环中尝试在索引0处访问它:

highest_list[0] = ...

这是不可能的,因为它是一个空列表,因此在第0位不能转位。

查找列表模式的更好方法是使用collections.Counter对象:

>>> from collections import Counter
>>> L = [1,2,3,3,4]
>>> counter = Counter(L)
>>> max(counter, key=counter.get)
3
>>> [(mode, n_occurrences)] = counter.most_common(1)
>>> mode, n_occurrences
(3, 2)

答案 1 :(得分:1)

至于获取模式,您只需使用集合库中的计数器

即可
from collections import Counter
x = [0, 1, 2, 0, 1, 0] #0 is the mode
g = Counter(x)
mode = max(g, key = lambda x: g[x])

答案 2 :(得分:0)

此时,在循环开始时,highest_list为空,因此没有第一个索引。您可以将highest_list初始化为[0],以便始终至少有一个"最高值。"

也就是说,您可以更简单地完成以下任务:

def mode(given_list):
    return max(set(given_list), key=given_list.count)

这将根据其中的每个项目given_list找到传递的count()中的最高项目。首先设置set可确保每个项目只计算一次。