2016-01-22 86 views
1
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]) 

該代碼旨在計算給定列表的模式。我不明白我出錯的地方。IndexError:列表分配索引超出範圍Python

準確的錯誤我正在收到。

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

回答

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

至於獲取模式,你可以使用從庫

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]) 
+0

您可以使用'g.get'而不是'lambda x:g [x]'。 – TigerhawkT3

0

在這一點上,集合了一個計數器,在循環的開始,highest_list是空的,所以沒有第一個索引。您可以將highest_list初始化爲[0],以便始終存在至少一個「最高值」。

這就是說,你可以更簡單地實現這一點,如下所示:

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

這會發現在通過given_list最高的項目,基於每個項目的count()在裏面。首先製作set確保每個項目只計算一次。

相關問題