如何返回字典中某个值的频率列表

5

我有一个字典,其键对应于一个包含字符串的列表。我想收集该列表中所有相同的值并将它们相加。也许我的解释有点混乱,所以我会提供一个例子:

function_name({'key1':['apple', 'orange'], 'key2':['orange', 'pear'})
>>> {'apple':1, 'orange':2, 'pear':1}
我该如何创建这个函数?我在考虑是否可以通过如下循环语句实现:
count = 0
for fruit in dict_name:
    if food == 'apple'
        count = count + fruit

我仍然不确定如何格式化这个内容,特别是如何计算并收集值,感谢任何建议!

3个回答

7
你可以将字典的值解嵌套并应用Counter
>>> from collections import Counter
>>> 
>>> d = {'key1':['apple', 'orange'], 'key2':['orange', 'pear']}
>>> Counter(v for sub in d.values() for v in sub)
Counter({'apple': 1, 'orange': 2, 'pear': 1})
如果您不喜欢嵌套的生成器推导式,可以使用 itertools.chain.from_iterable 进行解嵌套。
>>> from itertools import chain
>>> Counter(chain.from_iterable(d.values()))
Counter({'apple': 1, 'orange': 2, 'pear': 1})
没有导入和传统循环,代码会像这样:
>>> result = {}
>>> for sub in d.values():
...:    for v in sub:
...:        result[v] = result.get(v, 0) + 1
...:        
>>> result
{'apple': 1, 'orange': 2, 'pear': 1}

一个程序中有多个for循环是否合适? - Emma Pascoe
1
@EmmaPascoe 确定的。 - timgeb
1
非常感谢,它已经生效了!我能问一下 (v, 0) 这部分代表什么吗? - Emma Pascoe
1
@EmmaPascoe result.get(v, 0) 的意思是:如果v不在result中,就返回0,否则返回result[v] - timgeb
我明白了,这是一个字典方法吗? - Emma Pascoe
1
@EmmaPascoe 是的,你可以在这里找到一个解释。 - timgeb

2
类似这样的代码应该可以解决问题:
>>> from collections import Counter
>>> counts = Counter([item for sublist in your_dict.values() for item in sublist])

1
如果您不想导入任何库,可以按照以下方式操作:
function_name = {'key1':['apple', 'orange'], 'key2':['orange', 'pear']}
foobar = {}
for key, value in function_name.items():
    for element in value:
        if element in foobar:
            foobar[element] += 1
        else:
            foobar[element] = 1
print(foobar)
您需要检查值是否已经存在于创建的字典 'foobar' 中。如果存在,则将其值加一。如果不存在,则将该值作为键添加,并将其值定义为一。 :)

1
我建议您考虑使用字典的setdefault()方法,而不是if element in foobar:。这种方法不需要导入库,并且可以将内部for循环中的代码减少为一个无条件语句。setdefault()方法是一种更好的选择。 - martineau
是的,我同意!我只是想让新手也能轻松理解字典的用法。而且我觉得我这样做是 OP 想要的方式 :) - Carl Smestad
@martineau 在这里如何使用 setdefault?难道它不更适合用于 get 的用例吗? - timgeb
1
@timgeb: 也可以使用get()。我在考虑foobar[element] = foobar.setdefault(element, 0) + 1,尽管承认foobar[element] = foobar.get(element, 0) + 1会稍微更简洁一些。 - martineau
@martineau 是的,根据我的经验,当字典应该具有可变值时,setdefault 最有用,例如 d.setdefault(k, []).append(1)(不需要赋值)。 - timgeb
@timgeb:说得好——无论如何,我的评论的主要观点是,内置的dict类具有可用于简化此答案中提出的“无需import”方法的方法。 - martineau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,