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

Python 我需要创建一个for循环来生成嵌套字典,python,Python,我需要创建一个for循环,在每次检测到不存在的键时生成一个新的嵌套字典。我正在从以前的函数中获取外部字典的信息 它将需要创建一个字典,可用的运动作为它的键,字典作为它的键 价值观 在内部词典中,运动员姓名将作为其关键字和奖牌数量 (整数)将是其值。 Key=Sport,Value={:} CSE 231 2019年春季 函数将从get_country_stats()遍历字典以查找 运动员、运动和奖牌。请注意,当您想要为一项新运动添加运动员时,您需要 首先为该项运动创建一个空字典,然后才能向其中

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

  • 它将需要创建一个字典,可用的运动作为它的键,字典作为它的键 价值观
  • 在内部词典中,运动员姓名将作为其关键字和奖牌数量 (整数)将是其值。 Key=Sport,Value={:} 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
如果找不到所需的钥匙(运动),我希望能够生成一个新的外部字典,然后在每次为特定运动员找到奖牌时更新内部字典的值

这是国家/地区功能的输出,该功能正用于我现在尝试创建的功能中:

{'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
体育指数=3
def显示每项运动的最佳运动员(运动员、国家、运动):
结果={}
对于国家/地区\名称,运动员\国家/地区中的数据。项()
对于运动员数据中的运动员数据:
运动员=运动员数据[运动员指数]
运动=运动员数据[运动指数]
如果结果是:
如果运动员在结果[运动]中:
结果[运动][运动员]+=1#这名运动员和这项运动的奖牌数再加1。
其他:
结果[运动][运动员]=1#这名运动员没有这项运动的奖牌,但这项运动已经存在。为运动员创建一个新的关键点。
其他:
结果[运动]={athletor:1}#运动和运动员都还不存在,所以我们初始化了一个内部字典。
返回结果
所提供数据的输出:

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

好吧,现在秘密已经泄露了。这是我的看法。我认为最好将检查一个条目出现在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提供的答案相同,因此这两种方法都是解决问题的有效方法,而且方法也非常相似。

这里有一个更精简的版本,突出了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}
}

您是否有一些示例数据和预期输出?如果包含
get\u country\u stats()
的示例输出,我们将提供更相关的数据responses@Reedinationer好的,对不起,这是我第一次使用stackoverflow!一些建议:1)不要使用大写字母作为变量名。为类和其他类型名称保留这些名称。2) 使用
outer_dict={sport:internal_dict}
,您正在为您处理的每个项目破坏整个数据结构。3) 如果定义了运动,它将始终在外部目录中,因此如果您没有处理任何项目,您的第二个if将不会执行任何操作,除非崩溃。@Steve大写参数已由我们的讲师提供。谢谢你的建议,我会做出修改。注意,虽然两个答案大致相同,但顺序不同。一般来说,在所有计算中,任何基于HashMap的数据结构都不会以任何方式进行排序……您不能依赖于检索值的顺序。@alexia231,我认为有一个想法对您很有价值,请看这里。当你越来越多地编程时,你会一次又一次地做这个基本的事情。看看我如何确保数据中存在各种“bucket”,而不真正添加数据?这可以从以下事实看出:
outer_dict[sport][atternate]+=1
总是被调用。因此,只有一种方法可以将实际数据添加到结构中。我认为这是一项有价值的施工技术。当您的代码变得更复杂时,这将简化它。@gmds,我确实看到了一个小问题。“结果[运动]=1”一行的想法是什么?这是否意味着您将得到一个映射,对于某些键,它包含另一个映射作为值,而对于其他键,它包含一个整数值?我认为这不是一件好事如果这种情况没有出现在输出中,我想它永远不会发生。@Steve Good catch,那是我的错。@gmds通过将索引值抽象为常量标签运动员索引和运动索引,做了一件好事!