2016-10-12 6 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 

私は関数は最後の2行を繰り返さない作るように見えることはできません。私はなぜ0と3のために再び繰り返されているのかわかりません。

アイデア?

+0

それは 'for'ループは数字が引用される可能性があり現状ではたとえモードでなくてもモードとして扱うことができます。あなたのコードは、その数が最大数***以上であれば、モードであると主張します。 – jez

答えて

2

あなたは二度のモードを取得する理由は、あなたのforループは、リスト内のすべての要素に対してループをということです。したがって、以前に表示された要素の2番目のインスタンスに出会うと、それが再び出力されます。

他のニュースでは、あなたの関数は別の理由で失敗します。最初に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

ありがとう、私は今それを理解しています。結果の後に "None"が印刷される理由は何ですか? –

+0

@Pythonguy:それは印刷物ではありません。 Pythonシェルから関数を呼び出すと、何も返されないので、関数の戻り値は 'None'です。シェルから関数を呼び出すので、その戻り値も画面に表示されるので、 'None'と表示されます。 – inspectorG4dget

+0

ああ、ありがとう。私はprint()を関数呼び出しから削除しました。 –

2

あなたのリストにそれらの番号が2つあるため、それらの行が繰り返されます。

あなたの関数は、カウンタを更新するためにすでに数字が表示されているかどうかを追跡しません。

、物事を数えるcollectionsモジュールから適切な名前Counterを使用するには:これを行うために他の方法は、あなたがすでに見てきた数を追跡することで、ちょうどそのカウンタを更新し、

>>> 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 
関連する問題