2016-10-12 30 views
-1

這是一個簡單的功能,但它給我一個很難。我試圖在列表中計算模式,如果有> 1個模式(具有相同的頻率),則需要顯示它們。Python在列表中計算多種模式

def compute_mode(numbers): 
mode = 0 
count = 0 
maxcount = 0 
for number in numbers: 
    count = numbers.count(number) 
    if count >= maxcount: 
     maxcount = count 
     mode = number 
     print("Mode: ", mode, "Count: ", maxcount) 

函數調用:

print(compute_mode([0,1,3,5,7,3,0])) 

輸出:

Mode: 0 Count: 2 
Mode: 3 Count: 2 
Mode: 3 Count: 2 
Mode: 0 Count: 2 

我似乎無法使功能不重複的最後兩行。我不知道爲什麼它重複0和3.

任何想法?

+0

因爲它代表了'for'循環可能導致號碼被引用作爲模式,即使它們不是模式。如果您的代碼的計數等於或超過***迄今爲止的最大數量***,而不是整體的最大數量,則您的代碼將聲明一個數字是一種模式。 – jez

回答

2

你得到的方式兩次的原因是你的for循環列表中的每一個元素遍歷。因此,當它遇到先前看到的元素的第二個實例時,它將再次打印出來。

在其他新聞中,您的功能將因不同原因失敗 - 請嘗試刪除第一個0並查看會發生什麼。

這是我會怎麼解決這個問題:

from collections import Counter 

def compute_mode(numbers): 
    counts = Counter(numbers) 
    maxcount = max(counts.values()) 
    for num,count in counts: 
     if count == maxcount: 
      print(num, count) 

如果你想要做所有繁重自己:

def compute_mode(numbers): 
    counts = {} 
    maxcount = 0 
    for number in numbers: 
     if number not in counts: 
      counts[number] = 0 
     counts[number] += 1 
     if counts[number] > maxcount: 
      maxcount = counts[number] 

    for number, count in counts.items(): 
     if count == maxcount: 
      print(number, count) 
+0

謝謝,我現在明白了。在結果後打印「無」的任何原因? –

+0

@Pythonguy:那不是印刷品。當你從python shell調用函數時,函數的返回值是'None',因爲它不返回任何東西。既然你從shell調用函數,它的返回值也會顯示在屏幕上,這就是爲什麼你會看到'None' – inspectorG4dget

+0

啊,謝謝。我從函數調用中刪除了print(),現在一切正常。 –

2

它重複這些行,僅僅是因爲你在你的列表中有2個這樣的數字。

如果您的函數已經看到一個數字,那麼您的函數不會跟蹤它,以便爲其更新計數器。

要計算的東西,使用適當命名Countercollections模塊:

>>> from collections import Counter 
>>> Counter([0,1,3,5,7,3,0]).most_common() 
[(0, 2), (3, 2), (1, 1), (5, 1), (7, 1)] 

或者其他的方式來做到這一點是保持跟蹤你已經看到了一些,只是更新其計數器在詞典中(這類似於如何Counter作品),使用defaultdict

>>> from collections import defaultdict 
>>> d = defaultdict(int) 
>>> for i in [0,1,3,5,7,3,0]: 
... d[i] += 1 
... 
>>> d 
defaultdict(<class 'int'>, {0: 2, 1: 1, 3: 2, 5: 1, 7: 1}) 
>>> for item, count in d.items(): 
... print('Mode: {} Count: {}'.format(item, count)) 
... 
Mode: 0 Count: 2 
Mode: 1 Count: 1 
Mode: 3 Count: 2 
Mode: 5 Count: 1 
Mode: 7 Count: 1