2017-02-10 22 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中工作):

from collections import Counter 
lst1 = ['red', 'blue', 'red', 'green', 'blue', 'blue'] 

class count_helper: 
    def __init__(self): 
     self.sm = 1.0 
     self.cnt = Counter() 

    def count_colors(self,lst): 
     for w in lst: 
      self.cnt[w]+=1.0 

    def __call__(self,color='blank'): 
     s = sum(self.cnt.values()) 
     c = len(self.cnt) 
     return (self.cnt[color] + self.sm)/(s + (self.sm *c)) 

cntc = count_helper() 
cntc.count_colors(lst1) 
print(cntc('yellow')) 

結果:

0.111111111111 

和:通過調用

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

,然後使用它:

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

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

您能否解釋一下使用面向對象編程來獲得理想結果的原因 –

+0

您需要一種方法來爲任何輸入(函數)執行函數,但是您的計數器對象必須保存其他值(您的列表).. /你可以獨立保存計數器,但這會很醜陋/,更優雅的形式是將其包含在其他更大的對象內,他的一種方法是打印請求的公式,我會更新我的答案,以強調這一點。 –

0

您可以添加使用自定義的方法

print getCount(cnt, "yellow")