字典:如何计算列表中值的频率--Python3

时间:2015-11-30 20:38:28

标签: python dictionary frequency

我有一个字典,每个键都有多个值。因此我正在使用值列表。现在我想计算一个值在这个值列表中出现的频率。 例如,我有以下字典:

dic = {}
dic.setdefault(„Sam“, []).append(„Smith“)
dic.setdefault(„Sam“, []).append(„Miller“)
dic.setdefault(„Sam“, []).append(„Smith“)

所以

for k, v in dic.items():
    print(k,v)

结果:

  Sam [Smith, Miller, Smith]

现在我想计算每个值出现的频率,并在值本身旁边打印频率。我希望输出看起来如下:

Smith: 2, Miller: 1

为此,我尝试了以下代码但没有成功:

D = defaultdict(list)
for i, item in enumerate(mylist):
    D[item].append(i)
D = {k: len(v) for k, v in D.items()}
print(D)

此代码适用于以下简单列表:

mylist = [10, 20, 30, 10, 30]

对于这种类型的列表,上面的代码将产生我期望的结果:

{10: 2, 30:2, 20:1}

但是它不适用于包含值的列表。相反,它在第二行中使用“dic”而不是“mylist”时显示以下错误消息:

TypeError:不可用类型:'list'

如果有人能提供帮助,会很棒。

1 个答案:

答案 0 :(得分:0)

这实际上是创建一个" Count"特征。问题是您的代码会计算列表中的项目,因此将字典传递给它将无法正常工作。相反,您应该传递dic.items()中的值。如果我们使用你拥有的东西:

for k, v in dic.items():
    D = defaultdict(list)
    for i, item in enumerate(v):
        D[item].append(i)
    D = {k: v for k, v in D.items()}
    print(k, D)

另外,请查看collections.Counter这是Count的标准库实现。

from collections import Counter
for k, v in dic.items():
    print(k, Counter(v))