2017-02-10 9 views
0

Выходное значение кода: cnt ['yellow'] = ноль, но ожидаемое значение после применения формулы, приведенной в коде, должно быть (0 +1)/(6 + (1 * 3))Неожиданное значение счетчика питона

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

Собственно, '' yellow'' вообще не входит в ваш вход. Вы получаете счет по умолчанию. Здесь нет ничего, что могло бы применить ваш '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 

И:

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

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

Не могли бы вы объяснить причину использования объектно-ориентированного программирования для получения желаемого результата –

+0

вам понадобился способ выполнить функцию для любого ввода (функции), но ваш объект-счетчик должен сохранить другие значения (ваш список) ../you мог бы сохранить счетчик самостоятельно, но это было бы уродливым/более элегантным форматом, чтобы окутать его в другой более крупный объект, который одним из его методов будет напечатать запрошенную формулу, я обновлю свой ответ, чтобы подчеркнуть это. –

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")