我需要创建一个for循环,该循环会在每次检测到不存在的键时生成一个新的嵌套字典。我正在从以前的函数中获取外部字典的信息。
我启动了两个空字典,外字典和内字典。然后创建一个外部for循环,该循环遍历所有键值对并返回一个列表
def display_best_athletes_per_sport(Athlete, Country, Sports):
medals = 0
outer_dict = {}
inner_dict = {}
for key, value in Country.items():
for item in value:
athlete = item[0]
medals = item[5]
sport = item[3]
inner_dict = {athlete:medals}
outer_dict = {sport:inner_dict}
if sport not in outer_dict:
new_dict[sport] = value[i]
if medals in value:
medals += 1
else:
medals = 1
如果找不到所需的键(运动),我希望能够生成一个新的外部词典,每次找到特定运动员的奖牌时,都要更新内部词典的值。
这是Country函数的输出,该函数正在立即创建:
{'FIN': [
('Juhamatti Tapio Aaltonen', 'Finland', 2014, 'ice hockey', "ice hockey men's ice hockey", 'bronze'),
('Paavo Johannes Aaltonen', 'Finland', 1948, 'gymnastics', "gymnastics men's individual all-around", 'bronze'),
('Paavo Johannes Aaltonen', 'Finland', 1948, 'gymnastics', "gymnastics men's team all-around", 'gold'),
('Paavo Johannes Aaltonen', 'Finland', 1948, 'gymnastics', "gymnastics men's horse vault", 'gold'),
('Paavo Johannes Aaltonen', 'Finland', 1948, 'gymnastics', "gymnastics men's pommelled horse", 'gold'),
('Paavo Johannes Aaltonen', 'Finland', 1952, 'gymnastics', "gymnastics men's team all-around", 'bronze')],
'NOR': [
('Kjetil Andr Aamodt', 'Norway', 1992, 'alpine skiing', "alpine skiing men's super g", 'gold'),
('Kjetil Andr Aamodt', 'Norway', 1992, 'alpine skiing', "alpine skiing men's giant slalom", 'bronze'),
('Kjetil Andr Aamodt', 'Norway', 1994, 'alpine skiing', "alpine skiing men's downhill", 'silver'),
('Kjetil Andr Aamodt', 'Norway', 1994, 'alpine skiing', "alpine skiing men's super g", 'bronze'),
('Kjetil Andr Aamodt', 'Norway', 1994, 'alpine skiing', "alpine skiing men's combined", 'silver'),
('Kjetil Andr Aamodt', 'Norway', 2002, 'alpine skiing', "alpine skiing men's super g", 'gold'),
('Kjetil Andr Aamodt', 'Norway', 2002, 'alpine skiing', "alpine skiing men's combined", 'gold'),
('Kjetil Andr Aamodt', 'Norway', 2006, 'alpine skiing', "alpine skiing men's super g", 'gold'),
('Ann Kristin Aarnes', 'Norway', 1996, 'football', "football women's football", 'bronze')],
'NED': [('Pepijn Aardewijn', 'Netherlands', 1996, 'rowing', "rowing men's lightweight double sculls", 'silver')]}
答案 0 :(得分:1)
如何?
# Define these magic numbers outside so it's clearer what we're doing inside the function.
ATHLETE_INDEX = 0
SPORT_INDEX = 3
def display_best_athletes_per_sport(Athlete, Country, Sports):
result = {}
for country_name, athlete_data in Country.items():
for athlete_datum in athlete_data:
athlete = athlete_datum [ATHLETE_INDEX]
sport = athlete_datum [SPORT_INDEX]
if sport in result:
if athlete in result[sport]:
result[sport][athlete] += 1 # Just add 1 to the number of medals for this athlete and sport.
else:
result[sport][athlete] = 1 # This athlete has no medals for this sport, but the sport already exists. Create a new key for the athlete.
else:
result[sport] = {athlete: 1} # Both the sport and athlete don't exist yet, so we initialise an inner dictionary.
return result
提供的数据输出:
{'ice hockey': {'Juhamatti Tapio Aaltonen': 1},
'gymnastics': {'Paavo Johannes Aaltonen': 5},
'alpine skiing': {'Kjetil Andr Aamodt': 8},
'football': {'Ann Kristin Aarnes': 1},
'rowing': {'Pepijn Aardewijn': 1}}
答案 1 :(得分:1)
好吧,这只猫已经从书包里掏出来了。所以这是我的看法。我认为将检查条目显示在dict中与将某些内容添加到该条目分开是很好的。因此,当您添加条目时,它始终“尚无任何内容”。这样,无论条目是否存在,都可以用相同的方式对待“将下一项添加到条目”。鉴于此,正如我所见,这是您想要做什么的基本概念:
def display_best_athletes_per_sport(Athlete, Country, Sports):
outer_dict = {}
for key, value in Country.items():
for item in value:
athlete = item[0]
medals = item[5]
sport = item[3]
if sport not in outer_dict:
outer_dict[sport] = {}
if athlete not in outer_dict[sport]:
outer_dict[sport][athlete] = 0
outer_dict[sport][athlete] += 1
pprint(outer_dict)
结果如下:
{'alpine skiing': {'Kjetil Andr Aamodt': 8},
'football': {'Ann Kristin Aarnes': 1},
'gymnastics': {'Paavo Johannes Aaltonen': 5},
'ice hockey': {'Juhamatti Tapio Aaltonen': 1},
'rowing': {'Pepijn Aardewijn': 1}}
这与@gmds提供的答案相同,因此这两种都是解决问题的有效方法,并且处理方法非常相似。
答案 2 :(得分:0)
以下是更简洁的版本,突出显示了Python字典的get()
方法的值:
final = {}
for abb, data in Country.items():
for i in data:
final[i[3]] = final.get(i[3], {i[0]: 0})
final[i[3]][i[0]] += 1
首先,我们为输出实例化一个空字典final
。然后,我们遍历您的Country
字典(注意,您应该使用大写的变量名来保留类),然后遍历给定国家/地区的每个条目。嵌套的for循环中的第一行可确保为相关运动创建内部字典(如果尚不存在),嵌套的for循环中的第二行可捕获问题中奖牌部分的增量添加。
上面的代码产生:
{
'ice hockey': {'Juhamatti Tapio Aaltonen': 1},
'gymnastics': {'Paavo Johannes Aaltonen': 5},
'alpine skiing': {'Kjetil Andr Aamodt': 8},
'football': {'Ann Kristin Aarnes': 1},
'rowing': {'Pepijn Aardewijn': 1}
}