python - 包含键中项目的字典中所有值的总和

标签 python dictionary key

给定一个字典和一个字符串作为参数,返回一个新字典,其中包含指定为类别(第二个参数,'city'、'sport'、'name' 之一)的项目作为键及其关联值。如果该项出现不止一次,则取值的总和。

例。

>>> get_wins_by_category(d, 'city')
{'Toronto': 34, 'Ottawa': 45}
>>> get_wins_by_category(d, 'sport')
{'basketball': 31, 'hockey': 48}
>>> get_wins_by_category(d, 'name')
{'Raptors': 10, 'Blues': 21, 'Senators': 45, 'Leafs': 3}

到目前为止我得到了什么:

d = {('Raptors', 'Toronto', 'basketball'): 10,
     ('Blues', 'Toronto', 'basketball'): 21,
     ('Senators', 'Ottawa', 'hockey'): 45,
     ('Leafs', 'Toronto', 'hockey'): 3}

def get_wins_by_category(dct, category):
    new_dict = {}
    if category == 'city':
        for key in dct.keys():
            new_dict[key[1]] = #todo
    elif category == 'sport':
        for key in dct.keys():
            new_dict[key[2]] = #todo
    elif category == 'name':
        for key in dct.keys():
            new_dict[key[0]] = #todo
    return new_dict

我遇到的问题是在等号后面写什么。我知道如果该项目不止一次出现,它取包含该项目的所有值的总和,但我不知道如何将它写成代码。另请注意,三元组将始终按以下顺序排列:名称、城市、运动。

最佳答案

使用collections.defaultdict , 不需要 if-else:

from collections import defaultdict
def get_wins_by_category(team_to_win, category):

    d = {'name':0, 'city':1, 'sport':2}
    dic = defaultdict(int)
    for k, v in team_to_win.items():
        dic[k[d[category]]] += v
    return dic
... 
>>> get_wins_by_category(d, 'city')
defaultdict(<type 'int'>, {'Toronto': 34, 'Ottawa': 45})
>>> get_wins_by_category(d, 'sport')
defaultdict(<type 'int'>, {'basketball': 31, 'hockey': 48})
>>> get_wins_by_category(d, 'name')
defaultdict(<type 'int'>, {'Senators': 45, 'Blues': 21, 'Raptors': 10, 'Leafs': 3})

另一种选择是collections.Counter:

from collections import Counter
def get_wins_by_category(team_to_win, category):
    #index each category points to
    d = {'name':0, 'city':1, 'sport':2}
    dic = Counter()       
    for k, v in team_to_win.items():
        dic[k[d[category]]] += v
    return dic
... 
>>> get_wins_by_category(d, 'city')
Counter({'Ottawa': 45, 'Toronto': 34})
>>> get_wins_by_category(d, 'sport')
Counter({'hockey': 48, 'basketball': 31})
>>> get_wins_by_category(d, 'name')
Counter({'Senators': 45, 'Blues': 21, 'Raptors': 10, 'Leafs': 3})

关于python - 包含键中项目的字典中所有值的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20481552/

相关文章:

java - 具有键值对的树找不到键

android - buildozer 安装程序卡在 “compile platform” 段

python - PyMySQL 是否得到很好的支持?它比 MySQLdb 慢吗?

python - 使用 groupby 获取组中具有最大值的行

ios - Swift 字典中的属性观察器

Python - hash() 和 dict

xslt - 遍历/循环通过 XSL key : how?

python - VSCode pytest 测试发现失败

c++ - 何时检查项目是否已存在于 C++ 集合/映射中?

c++ - 比较它们之间的元素,得到共同值的键