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

2024-09-21 00:22:27 发布

您现在位置:Python中文网/ 问答频道 /正文

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

  • 它将需要创建一个字典,其中可用的运动作为它的键,而字典作为它的键 价值观。你知道吗
  • 在内部词典中,运动员的名字将被用作其关键字和奖牌的数量 (整数)将是其值。 Key=Sport,Value={:} CSE 231 2019年春季
  • 函数将在get\u country\u stats()的字典中循环查找 运动员、运动和奖牌。请注意,当您要为一项新运动添加运动员时,您需要 先为该运动创建一个空字典,然后才能向其中添加运动员。你知道吗
  • 奖章的类型(金、银、铜)与我们的新词典不相关,它们都是 被视为一枚奖牌。你知道吗

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

Tags: 字典dictalpinegoldmenandrfinlandnorway
3条回答

好吧,那只猫现在出局了。这是我的看法。我认为,最好将检查出现在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提供的答案是一样的,所以这两种方法都是解决问题的有效方法,而且做得非常相似。你知道吗

这个怎么样:

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

下面是一个更精简的版本,它突出了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}
}

相关问题 更多 >

    热门问题