为了账号安全,请及时绑定邮箱和手机立即绑定

关于嵌套字典的问题有没有办法将嵌套字典合并到一个字典中

关于嵌套字典的问题有没有办法将嵌套字典合并到一个字典中

HUX布斯 2022-05-24 17:22:35
我正在学习关于 runestone 的 python 课程,但我遇到了以下问题:提供了一个包含 pokemon go 玩家数据的字典,其中每个玩家显示每个 pokemon 拥有的糖果数量。如果将所有数据汇总在一起,哪个口袋妖怪的糖果数量最多?将该口袋妖怪分配给变量most_common_pokemon。我的想法是创建一个合并公共键(及其值或进行比较的字典)if x>y   x=y所以我可以得到糖果数量最多的口袋妖怪pokemon_go_data = {'bentspoon':                  {'Rattata': 203, 'Pidgey':20, 'Drowzee': 89, 'Squirtle': 35, 'Pikachu': 3, 'Eevee': 34, 'Magikarp': 300, 'Paras': 38},                  'Laurne':                  {'Pidgey': 169, 'Rattata': 245, 'Squirtle': 9, 'Caterpie': 38, 'Weedle': 97, 'Pikachu': 6, 'Nidoran': 44, 'Clefairy': 15, 'Zubat': 79, 'Dratini': 4},                  'picklejarlid':                  {'Rattata': 32, 'Drowzee': 15, 'Nidoran': 4, 'Bulbasaur': 3, 'Pidgey': 56, 'Weedle': 21, 'Oddish': 18, 'Magmar': 6, 'Spearow': 14},                  'professoroak':                  {'Charmander': 11, 'Ponyta': 9, 'Rattata': 107, 'Belsprout': 29, 'Seel': 19, 'Pidgey': 93, 'Shellder': 43, 'Drowzee': 245, 'Tauros': 18, 'Lapras': 18}}pokemon=[]for i,k in pokemon_go_data.items():    b=k.keys()    b=list(b)    pokemon.append(b)print (pokemon)  poke=[]for i in pokemon:    for j in i:        if j not  in poke:            poke.append(j)        else:            continueprint(poke) d={}n=0count=[]total=0most_common_pokemon=""for players in pokemon_go_data:    for pokemon in pokemon_go_data[players]:            if pokemon==poke[n]:                 count.append(pokemon_go_data[players][pokemon])                 counts=sum(count)                 print (count)                 print(counts)                 d[poke[n]]=countsprint (d) 通过这样做,它会打印一个字典:{'Rattata': 587}但是如果我添加一个计数器,就像n+=1我得到以下{'Rattata': 203, 'Pidgey': 372, 'Drowzee': 387}如果不是创建字典,而是if count>total:            total=count            most_common_pokemon=poke[n]n+1=n我收到超出范围的错误消息,我将计数器放在任何地方,但它不起作用……当我重置计数时
查看完整描述

3 回答

?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

这应该这样做:


pokemon_total = {}


for player, dictionary in pokemon_go_data.items():

    for pokemon, candy_count in dictionary.items():

        if pokemon in pokemon_total.keys():

            pokemon_total[pokemon] += candy_count

        else:

            pokemon_total[pokemon] = candy_count


most_common_pokemon = max(pokemon_total, key=pokemon_total.get)


print(most_common_pokemon)


查看完整回答
反对 回复 2022-05-24
?
浮云间

TA贡献1829条经验 获得超4个赞

T 刚刚这样做对我有用,并给出了正确的答案'Rattata'


pokemon_go_data = {'bentspoon':

                       {'Rattata': 203, 'Pidgey': 120, 'Drowzee': 89, 'Squirtle': 35, 'Pikachu': 3, 'Eevee': 34,

                        'Magikarp': 300, 'Paras': 38},

                   'Laurne':

                       {'Pidgey': 169, 'Rattata': 245, 'Squirtle': 9, 'Caterpie': 38, 'Weedle': 97, 'Pikachu': 6,

                        'Nidoran': 44, 'Clefairy': 15, 'Zubat': 79, 'Dratini': 4},

                   'picklejarlid':

                       {'Rattata': 32, 'Drowzee': 15, 'Nidoran': 4, 'Bulbasaur': 3, 'Pidgey': 56, 'Weedle': 21,

                        'Oddish': 18, 'Magmar': 6, 'Spearow': 14},

                   'professoroak':

                       {'Charmander': 11, 'Ponyta': 9, 'Rattata': 107, 'Belsprout': 29, 'Seel': 19, 'Pidgey': 93,

                        'Shellder': 43, 'Drowzee': 245, 'Tauros': 18, 'Lapras': 18}}


count_d={}

pokemon_main_lst=pokemon_go_data.keys()

#print(pokemon_main_lst)

for main_keys in pokemon_main_lst:

    pokemon_sub_lst=pokemon_go_data[main_keys].keys()

    #print(sub_lst)

    for pokemon in pokemon_sub_lst:

        if pokemon not in count_d:

            count_d[pokemon]=0

        count_d[pokemon]+=pokemon_go_data[main_keys][pokemon]

#print(count_d)


most_common_pokemon=sorted(count_d,key=lambda k:count_d[k])[-1]

print(most_common_pokemon)


查看完整回答
反对 回复 2022-05-24
?
繁星淼淼

TA贡献1775条经验 获得超11个赞

out = {}


for k,v in [[k2,p[k1][k2]] for k1 in p for k2 in p[k1]]:

    if k in out.keys():

        out[k] = out[k] + v

    else:

        out[k] = v


print(max(out, key=out.get))

原则上与上述答案基本相同,但实现略有不同


或者


from itertools import groupby    

out = sorted([[k2,p[k1][k2]] for k1 in p for k2 in p[k1]])

result = {a:sum(c for _, c in b) for a, b in groupby(out, key=lambda x:x[0])}

print(max(result,key=result.get))

或者


out = sum(map(Counter, p.values()), Counter())

print(max(out,key=result.get))


查看完整回答
反对 回复 2022-05-24
  • 3 回答
  • 0 关注
  • 104 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信