给定字典和字符串作为参数,返回一个新字典,其中包含指定为类别的项目(第二个参数,'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
我遇到的问题是在等号后写什么。我知道如果项目出现的次数超过了包含该项目的所有值的总和,但我不知道如何将其写为代码。还要注意三元组将始终按顺序排列:名称,城市,运动。
答案 0 :(得分:2)
使用collections.defaultdict
,否则不需要:
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})
答案 1 :(得分:1)
使用错误的数据结构总是会使您的代码编写和阅读变得更加复杂,并且通常也能有效地运行。
如果你想按值查找某些内容,请使用带有该值的dict(或namedtuple)作为键,不要遍历整个列表并逐个搜索。如果您需要创建多个dicts,请执行此操作。
例如:
from collections import Counter
teams, cities, sports = Counter(), Counter(), Counter()
for keys, score in d.items():
team, city, sport = keys
teams[team] += score
cities[city] += score
sports[sport] += score
categories = {'team': teams, 'city': cities, 'sport': sports}
现在你的代码很简单:
def get_wins_by_category(category):
return categories[category]
或者,或者,保留每个分数的所有分数,这样你除了得分之外还可以做其他事情(例如,平均分数):
from collections import Counter
teams, cities, sports = defaultdict(list), defaultdict(list), defaultdict(list)
for keys, score in d.items():
team, city, sport = keys
teams[team].append(score)
cities[city].append(score)
sports[sport].append(score)
categories = {'team': teams, 'city': cities, 'sport': sports}
def get_wins_by_category(category):
return {key: sum(scores) for key, scores in categories[category].items()}
def get_avg_wins_by_category(category):
return {key: sum(scores)/len(scores)
for key, scores in categories[category].items()}
答案 2 :(得分:0)
通过在if:
cats
块的需求
d = {('Raptors', 'Toronto', 'basketball'): 10,
('Blues', 'Toronto', 'basketball'): 21,
('Senators', 'Ottawa', 'hockey'): 45,
('Leafs', 'Toronto', 'hockey'): 3}
cats = ("team", "city", "sport")
def get_wins_by_category(d, cats, cat):
if cat in cats:
return {t: sum(v for k, v in d.items() if t in k)
for t in set(key[cats.index(cat)] for key in d)}
答案 3 :(得分:0)
if category == 'city':
for key, value in dct.items():
new_dict[key[1]] += value
你明白了......