我需要创建一个用于生成嵌套词典的for循环

时间:2019-04-01 22:44:12

标签: python

我需要创建一个for循环,该循环会在每次检测到不存在的键时生成一个新的嵌套字典。我正在从以前的函数中获取外部字典的信息。

  • 它将需要创建一个字典,以可用体育项目作为键,并以字典作为其字典 值。
  • 在内部词典中,运动员姓名将用作其键和奖牌数 (整数)将为其值。 键=运动,价值= {:} CSE 231 2019年春季
  • 该函数将循环从get_country_stats()的字典中查找 运动员,运动和奖牌。请注意,当您想为一项新运动添加一名运动员时,您需要 首先要为该运动创建一个空字典,然后再向其添加运动员。
  • 奖章的类型(金,银,铜)与我们的新词典无关,它们都是 视为1枚勋章。

我启动了两个空字典,外字典和内字典。然后创建一个外部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')]}

3 个答案:

答案 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}
}