嵌套字典相关问题是否有方法将嵌套字典合并为一个字典

2024-06-30 13:46:56 发布

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

我正在学习一门关于runestone的python课程,我被以下问题困住了:

提供了一个包含pokemongo玩家数据的字典,每个玩家都会显示他们pokemon的糖果量。如果你把所有的数据汇总在一起,哪个口袋妖怪的糖果数量最多?将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:
            continue
print(poke) 

d={}
n=0
count=[]
total=0
most_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]]=counts
print (d) 

这样它就打印出一个字典:{'Rattata': 587}

但是如果我添加一个类似n+=1的计数器,我会得到以下结果

{'Rattata': 203, 'Pidgey': 372, 'Drowzee': 387}

如果不是建立一个字典

if count>total:
            total=count
            most_common_pokemon=poke[n]
n+1=n

我收到一条超出范围的错误信息 我把计数器放在任何地方,但它不工作…而且当我重置计数

谢谢,任何建议都欢迎


Tags: ingomostfordataif字典count
2条回答

这应该做到:

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

相关问题 更多 >