嵌套字典排序求助:按子字典值及子字典长度排序
解决嵌套字典的排序问题
嘿,作为Python新手碰到嵌套字典排序确实容易懵,不过用sorted()结合lambda完全能搞定!我来一步步给你拆解怎么做。
需求拆解
你需要的排序规则是:
- 第一优先级:按玩家的分数降序排列(分数高的在前)
- 第二优先级:如果分数相同,按对应团队的玩家总数降序排列(玩家多的团队里的成员在前)
实现步骤
我们可以分三步来做:
- 先统计每个团队的玩家总数,方便后续排序时调用
- 把嵌套字典里的所有玩家信息拆成扁平的列表(每个元素包含团队名、玩家名、分数)
- 用
sorted()函数,通过lambda指定排序的优先级
代码示例
def sort_nested_dict(nested_dict): # 第一步:统计每个团队的玩家数量 team_player_count = {team: len(players) for team, players in nested_dict.items()} # 第二步:把所有玩家信息展开成列表 all_players = [] for team, players in nested_dict.items(): for name, score in players.items(): all_players.append( (team, name, score) ) # 第三步:按规则排序 # 排序key:(-分数, -团队玩家数),负号实现降序效果 sorted_players = sorted(all_players, key=lambda x: (-x[2], -team_player_count[x[0]])) # 按要求格式输出 for team, name, score in sorted_players: print(f"({team}) {name} <-> {score}") # 测试示例1 print("示例1输出:") example1 = {'Red': {'Pesho': 2000}, 'Blue': {'Tosho': 1000}, 'Green': {'Gosho': 1000}, 'Yellow': {'Sasho': 4500}, 'Stamat': {'Prakasho': 1000}} sort_nested_dict(example1) # 测试示例2 print("\n示例2输出:") example2 = {'Red': {'Pesho': 10000}, 'Blue': {'Pesho': 10000, 'Gosho': 10000}} sort_nested_dict(example2)
代码解释
team_player_count:用字典推导式快速算出每个团队的玩家数,比如示例2里的Blue对应2,Red对应1all_players:把嵌套结构拆成(团队名, 玩家名, 分数)的元组列表,让排序操作更直观sorted()里的lambda:-x[2]表示按分数降序(默认升序,加负号反转顺序),-team_player_count[x[0]]表示分数相同时,按团队玩家数降序排列,这也是示例2里Blue的玩家排在Red前面的原因
运行这段代码,输出结果就和你给出的完全一致啦!如果之后遇到分数和团队玩家数都相同的情况,还可以在lambda里加第三个排序条件,比如玩家名的字母顺序(x[1]),让排序逻辑更严谨。
内容的提问来源于stack exchange,提问作者Simomir
相关产品推荐
相关产品推荐

