2017-02-10 7 views
0

コードの出力値はcnt ['yellow'] = 0ですが、コードで指定された式を適用した後の期待値は(0 +1)/(6 +(1 * 3))関数を適用する予期しないpythonカウンタ値

from collections import Counter 
cnt = Counter() 
sm = 1 
for word in ['red', 'blue', 'red', 'green', 'blue', 'blue']: 
    cnt[word] += 1 

s = sum(cnt.values()) 
print(s) 

c = len(cnt) 
print(c) 

for k,v in cnt.items(): 
    cnt[k] = (cnt[k] + sm)/(s + (sm *c)) 

print(cnt['yellow']) 
+0

がありますあなたは確かに*これはPython 3.5? – user2357112

+1

実際、「黄色」はあなたの入力に全くありません。あなたはデフォルトのカウントを取得しています。あなたの 'cnt [k] =(cnt [k] + sm)/(s +(sm * c))'計算を 'cnt ['yellow']'に適用するものは何もありません。 – user2357112

+0

私はこのデフォルトゼロをこの計算によって何か肯定的な値に変更したいと思います。 –

答えて

1

は、任意の入力した値に、あなたはエレガントな方法だろう、クラスやメソッド、 を使用することができ、私はあなたのプログラムを知っていませんが、読みやすくするために、クラスの名前を変更することがあり、 (py2でテストされていますが、py3で動作するはずですが)py30で動作するはずです。結果:

0.111111111111 

そして:

In [13]: print(cntc('red')) 
0.333333333333 

In [14]: print(cntc('blue')) 
0.444444444444 
+0

オブジェクト指向プログラミングを使用して目的の結果を得る理由を説明してください。 –

+0

入力(関数)に対して関数を実行する方法が必要でしたが、カウンタオブジェクトは他の値(リスト)を保存する必要があります.. /独立したカウンタを保存することができますが、それは醜い/よりエレガントなフォームは、彼のメソッドの1つは、要求された数式を印刷することです他の大きなオブジェクトの内側にそれをエンベロープすることです、私は強調するために、 –

0

あなたが好きなカスタムメソッドを追加することができます。

def getCount(counter, key): 
    sm = 1 
    s = sum(cnt.values()) 
    c = len(cnt) 
    return (counter[key] + sm)/(s + (sm * c)) 

そして呼び出すことによって、それを使用する:

print getCount(cnt, "yellow") 
関連する問題