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