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)
答
更改此
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)
答
更好的方式是通过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()
代替。
'如果v不在计数器中:' - 如果在计数器字典中没有'v',为什么你要求它只是在下面行? '计数器[V] .append(东西)'? –
我知道你想自己实现这一点,但只是为了记录:'itertools'模块中有一个内置计数器 – RafaelC