对嵌套字典进行排序

Sorting a nested dictionary

提问人:yosef 提问时间:11/1/2023 最后编辑:Timur Shtatlandyosef 更新时间:11/1/2023 访问量:50

问:

我想根据点对这个字典中的团队进行排序,我已经遵循了这篇文章中的建议,我写的排序代码没有按照我想要的方式工作。

这是我的字典:

{
    'Spain': {
        'wins': 3,
        'loses': 0,
        'draws': 0,
        'goal difference': 4,
        'points': 9
    },
    'Iran': {
        'wins': 0,
        'loses': 3,
        'draws': 0,
        'goal difference': -6,
        'points': 0
    },
    'Portugal': {
        'wins': 2,
        'loses': 1,
        'draws': 0,
        'goal difference': 4,
        'points': 6
    },
    'Morocco': {
        'wins': 1,
        'loses': 2,
        'draws': 0,
        'goal difference': -2,
        'points': 3
    }
}

以及我用于排序的代码:

sorted_dict = OrderedDict(sorted(B_group.items(),key= lambda x:  x[1]["points"] ,reverse=True))

这是我得到的结果:

Spain  wins:3 , loses:0 , draws:0 , goal difference:4 , points:9
Iran  wins:0 , loses:3 , draws:0 , goal difference:-6 , points:0
Portugal  wins:2 , loses:1 , draws:0 , goal difference:4 , points:6
Morocco  wins:1 , loses:2 , draws:0 , goal difference:-2 , points:3

我希望它把最高分的球队放在第一位,例如,西班牙、葡萄牙、摩洛哥、伊朗在这个名单中。 我写的排序代码有问题吗?

python 字典 排序 嵌套

评论

2赞 Wondercricket 11/1/2023
据我所知,您的代码有效。你输出的是正确的(vs)吗?dictsorted_dictB_group
0赞 S.B 11/1/2023
在检查您的解决方案之前,我回答了。好像是一样的。你打印正确的吗?
1赞 John Gordon 11/1/2023
无法复制。当我运行此代码时,我按预期的顺序获得团队:西班牙、葡萄牙、摩洛哥、伊朗。您运行的代码必须与此处显示的代码不同。
0赞 John Gordon 11/1/2023
我认为@Wondercricket是对的——你错误地打印了原始字典而不是.B_groupsorted_dict
0赞 yosef 11/1/2023
谢谢大家,我发现代码是正确的,我只是打印乱序

答:

-1赞 Timur Shtatland 11/1/2023 #1

您不需要,因为 Python 3.7 字典保持插入顺序。请参阅:依赖 python 字典的插入顺序是好的做法吗? - 软件工程堆栈交换OrderedDict

使用适当的索引来访问字典值,如下所示:

dct = {
    'Spain':    {'wins': 3, 'loses': 0, 'draws': 0, 'goal difference': 4, 'points': 9},
    'Iran':     {'wins': 0, 'loses': 3, 'draws': 0, 'goal difference': -6, 'points': 0},
    'Portugal': {'wins': 2, 'loses': 1, 'draws': 0, 'goal difference': 4, 'points': 6},
    'Morocco':  {'wins': 1, 'loses': 2, 'draws': 0, 'goal difference': -2, 'points': 3}
}

sorted_dct = {k:dct[k] for k in reversed(sorted(dct, key = lambda x: dct[x]['points']))}

print(sorted_dct)
# {'Spain': {'wins': 3, 'loses': 0, 'draws': 0, 'goal difference': 4, 'points': 9}, 'Portugal': {'wins': 2, 'loses': 1, 'draws': 0, 'goal difference': 4, 'points': 6}, 'Morocco': {'wins': 1, 'loses': 2, 'draws': 0, 'goal difference': -2, 'points': 3}, 'Iran': {'wins': 0, 'loses': 3, 'draws': 0, 'goal difference': -6, 'points': 0}}