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

问题描述 投票:3回答:3

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

  • 它需要创建一个字典,其中可用的体育作为其键,字典作为其值。
  • 在内部字典中,运动员名称将用作其关键字,奖牌数量(整数)将是其值。 Key = Sport,Value = {:} CSE 231 Spring 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')]}
python
3个回答
1
投票

嗯,猫现在已经不在了。所以这是我对此的看法。我认为将检查条目中的条目与在该条目中添加内容分开是很好的。因此,当您添加条目时,它始终“还没有任何内容”。这使您可以以相同的方式处理“将下一个项目添加到条目”,无论条目是否存在。鉴于此,正如我所看到的,这是您想要做的基本想法:

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提供的答案相同,因此两者都是解决问题的有效方法,并且完全相同。


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

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}
}
© www.soinside.com 2019 - 2024. All rights reserved.