Python:计算字典中的频率

问题描述:

我想计算字典中每个值的数量,并构造一个新的值作为关键字,以及一个表示值为值的关键字列表。Python:计算字典中的频率

Input : 
b = {'a':3,'b':3,'c':8,'d':3,'e':8} 
Output: 
c = { '3':[a. b. d] 
     '8':[c, e] 
        } 

我写了以下内容,但它引发了一个关键错误,并没有给出任何输出,有人可以帮忙吗?

def dictfreq(b): 
    counter = dict() 
    for k,v in b.iteritems(): 
     if v not in counter: 
      counter[v].append(k) 
     else: 
      counter[v].append(k) 

    return counter 


print dictfreq(b) 
+0

'如果v不在计数器中:' - 如果在计数器字典中没有'v',为什么你要求它只是在下面行? '计数器[V] .append(东西)'? –

+0

我知道你想自己实现这一点,但只是为了记录:'itertools'模块中有一个内置计数器 – RafaelC

更改此

if v not in counter: 
     counter[v].append(k) 
    else: 
     counter[v].append(k) 

这样:实现这个

if v not in counter: 
     counter[v] = [] # add empty `list` if value `v` is not found as key 
    counter[v].append(k) 
+0

这工作,谢谢。这是我可以避免重大错误的一般方式吗?只要申报一个空的字符串/列表/ whathaveyou到位? – onlyf

+0

@onlyf确实如此。像'defaultdict'这样的其他解决方案完全可以做到。 – freakish

+0

好的,谢谢!对于像我这样的新人来说,这一直是头痛的问题。 – onlyf

更好的方式是通过collections.defaultdict。例如:

from collections import defaultdict 
b = {'a':3,'b':3,'c':8,'d':3,'e':8} 

new_dict = defaultdict(list) # `list` as default value 
for k, v in b.items(): 
    new_dict[v].append(k) 

通过new_dict终值保持将是:

{8: ['c', 'e'], 3: ['a', 'b', 'd']} 

您可以使用dict.setdefault方法:

>>> c = {} 
>>> for key, value in b.iteritems(): 
...  c.setdefault(value, []).append(key) 
... 
>>> c 
{8: ['c', 'e'], 3: ['a', 'b', 'd']} 

在Python3使用b.items()代替。