给定一个字典和一个字符串作为参数,返回一个新字典,其中包含指定为类别的项(第二个参数,“ 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
我的问题是等号后写什么.我知道,如果不止一次出现该项目,且该项目取包含该项目的所有值的总和,但我不知道如何将其编写为代码.另请注意,三元组将始终按此顺序排列:名称,城市,运动.
解决方法:
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(, {'Toronto': 34, 'Ottawa': 45})
>>> get_wins_by_category(d, 'sport')
defaultdict(, {'basketball': 31, 'hockey': 48})
>>> get_wins_by_category(d, 'name')
defaultdict(, {'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})
标签:dictionary,key,python
来源: https://codeday.me/bug/20191122/2059383.html