如何计算键的每个值出现的次数?

时间:2013-11-26 01:50:52

标签: python python-3.x

例如,如果我有一个列出农场动物的字典,它将如下:

{"groupA":["cow","lamb","lamb","lamb"], "groupB":["cow","cow"]}

我如何计算每个值出现在相应密钥中的次数?我想要groupA cow 1,groupA lamb 3,groupB cow 2.更棘手的部分是字典不是固定的,它需要是动态的。过去的groupB可能会有更多的键(例如groupC,D组),并且可能有更多或更少的值与之关联。我通过弹出每个键然后使用if函数查看它包含的内容然后放置一个计数器来找出一个静态的方法。 (只有两只动物将是牛或羊)。遗憾的是,我无法确定如何动态执行此操作,因为我永远不知道会有多少键。非常感谢你们的帮助。我无法在任何地方找到答案而且此刻非常沮丧。

5 个答案:

答案 0 :(得分:2)

我认为规范的方法是使用collections.Counter

>>> from collections import Counter
>>> d = {"groupA":["cow","lamb","lamb","lamb"], "groupB":["cow","cow"]}
>>> dc = {k: Counter(v) for k,v in d.items()}
>>> dc
{'groupA': Counter({'lamb': 3, 'cow': 1}), 'groupB': Counter({'cow': 2})}

之后您可以访问嵌套计数:

>>> dc["groupA"]["lamb"]
3

答案 1 :(得分:2)

使用Counter

的另一种解释
>>> from collections import Counter
>>> D = {"groupA":["cow","lamb","lamb","lamb"], "groupB":["cow","cow"]}
>>> Counter((k,v) for k in D for v in D[k])
Counter({('groupA', 'lamb'): 3, ('groupB', 'cow'): 2, ('groupA', 'cow'): 1})

如果您需要dict

>>> dict(Counter((k,v) for k in D for v in D[k]))
{('groupA', 'cow'): 1, ('groupB', 'cow'): 2, ('groupA', 'lamb'): 3}

list

>>> list(Counter((k,v) for k in D for v in D[k]).items())
[(('groupA', 'cow'), 1), (('groupB', 'cow'), 2), (('groupA', 'lamb'), 3)]

答案 2 :(得分:0)

您可以先使用以下函数计算列表中每个项目的数量:

def countList(list):
    counts = {}
    for l in list:
        if l in counts:
            counts[l] += 1
        else:
            counts[l] = 1
    return counts

答案 3 :(得分:0)

在每个动物名单上使用count方法:

farm = {"groupA":["cow","lamb","lamb","lamb"], "groupB":["cow","cow"]}
for group_name, animal_list in farm.items():
    for animal in 'cow', 'lamb':
        print(group_name, animal, animal_list.count(animal))

答案 4 :(得分:0)

rite={"groupA":["cow","lamb","lamb","lamb"], "groupB":["cow","cow"]}

for i,j in rite.iteritems():
    b=set(j)
    for k in b:
        print i,k,j.count(k)