如何按python dict的值排序?

2024-07-05 14:56:15 发布

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

最初的数据是:

dict = {<User: user2>: {'diff': 48, 'alike': 1}, <User: user3>: {'diff': 42, 'alike': 2}, <User: user4>: {'diff': 45, 'alike': 1}, <User: user5>: {'diff': 43, 'alike':
 2}, <User: user6>: {'diff': 46, 'alike': 1}, <User: user7>: {'diff': 46, 'alike': 1}, <User: user8>: {'diff': 49, 'alike': 1}, <User: user9>: {'diff': 50, 'ali
ke': 0}, <User: user10>: {'diff': 46, 'alike': 1}, <User: user11>: {'diff': 37, 'alike': 3}, <User: user12>: {'diff': 50, 'alike': 0}, <User: user13>: {'diff':
50, 'alike': 0}, <User: user14>: {'diff': 50, 'alike': 0}, <User: user15>: {'diff': 50, 'alike': 0}, <User: user16>: {'diff': 50, 'alike': 0}, <User: user17>: {
'diff': 50, 'alike': 0}, <User: user18>: {'diff': 50, 'alike': 0}, <User: user19>: {'diff': 50, 'alike': 0}, <User: user20>: {'diff': 50, 'alike': 0}}

然后我把它分类:

^{pr2}$

如何按“diff”排序?在


Tags: 数据diffalidictkeuseruser2user6
2条回答
sorted(your_list, key=lambda el: el["diff"])

key关键字参数应该是一个函数,它接受要排序的列表的元素,并返回排序比较中应该使用的值。lambda是{}的简写,也就是说,它定义了一个函数(有几个限制)。同样的一行可以这样写:

^{pr2}$

首先,您没有对dict排序,而是对dicts的列表进行排序,这是非常不同的事情,尤其是Python中的dict没有定义顺序。在

您可以使用^{}^{}轻松完成此操作:

import operator
sorted_dicts = sorted(dicts, key=operator.itemgetter("diff"))

sorted()内置函数接受key关键字参数,这是一个接受该值并给出另一个值进行排序的函数。这里我们使用itemgetter()dict中获取所需的值来进行排序。在

编辑:

鉴于你的改变,有两个答案,因为你不清楚。如果需要值列表,只需从原始dict中提取它们:

^{pr2}$

这和拿dict.values()一样简单。当然,在python2.x下,您将希望使用viewitems()或{}来获得良好的性能。在

如果你想对dict本身进行排序,那是另一回事,因为{}本身就是无序的。在

首先,我想指出,sorted(dict)不会产生您建议的输出-dict迭代键,而不是默认值:

users = {
    '<User: user10>': {'alike': 1, 'diff': 46},
    '<User: user11>': {'alike': 3, 'diff': 37},
    '<User: user12>': {'alike': 0, 'diff': 50},
    '<User: user13>': {'alike': 0, 'diff': 50},
    '<User: user14>': {'alike': 0, 'diff': 50},
    '<User: user15>': {'alike': 0, 'diff': 50},
    '<User: user16>': {'alike': 0, 'diff': 50},
    '<User: user17>': {'alike': 0, 'diff': 50},
    '<User: user18>': {'alike': 0, 'diff': 50},
    '<User: user19>': {'alike': 0, 'diff': 50},
    '<User: user20>': {'alike': 0, 'diff': 50},
    '<User: user2>': {'alike': 1, 'diff': 48},
    '<User: user3>': {'alike': 2, 'diff': 42},
    '<User: user4>': {'alike': 1, 'diff': 45},
    '<User: user5>': {'alike': 2, 'diff': 43},
    '<User: user6>': {'alike': 1, 'diff': 46},
    '<User: user7>': {'alike': 1, 'diff': 46},
    '<User: user8>': {'alike': 1, 'diff': 49},
    '<User: user9>': {'alike': 0, 'diff': 50}
}

print(sorted(users))

给我们:

['<User: user10>', '<User: user11>', '<User: user12>', '<User: user13>', '<User: user14>', '<User: user15>', '<User: user16>', '<User: user17>', '<User: user18>', '<User: user19>', '<User: user20>', '<User: user2>', '<User: user3>', '<User: user4>', '<User: user5>', '<User: user6>', '<User: user7>', '<User: user8>', '<User: user9>']

要生成已排序的dict,我们需要使用^{}

import collections

users = {
    '<User: user10>': {'alike': 1, 'diff': 46},
    '<User: user11>': {'alike': 3, 'diff': 37},
    '<User: user12>': {'alike': 0, 'diff': 50},
    '<User: user13>': {'alike': 0, 'diff': 50},
    '<User: user14>': {'alike': 0, 'diff': 50},
    '<User: user15>': {'alike': 0, 'diff': 50},
    '<User: user16>': {'alike': 0, 'diff': 50},
    '<User: user17>': {'alike': 0, 'diff': 50},
    '<User: user18>': {'alike': 0, 'diff': 50},
    '<User: user19>': {'alike': 0, 'diff': 50},
    '<User: user20>': {'alike': 0, 'diff': 50},
    '<User: user2>': {'alike': 1, 'diff': 48},
    '<User: user3>': {'alike': 2, 'diff': 42},
    '<User: user4>': {'alike': 1, 'diff': 45},
    '<User: user5>': {'alike': 2, 'diff': 43},
    '<User: user6>': {'alike': 1, 'diff': 46},
    '<User: user7>': {'alike': 1, 'diff': 46},
    '<User: user8>': {'alike': 1, 'diff': 49},
    '<User: user9>': {'alike': 0, 'diff': 50}
}

print(collections.OrderedDict(sorted(users.items(), key=lambda x: x[1]["diff"])))

这给了我们:

OrderedDict([('<User: user11>', {'diff': 37, 'alike': 3}), ('<User: user3>', {'diff': 42, 'alike': 2}), ('<User: user5>', {'diff': 43, 'alike': 2}), ('<User: user4>', {'diff': 45, 'alike': 1}), ('<User: user10>', {'diff': 46, 'alike': 1}), ('<User: user7>', {'diff': 46, 'alike': 1}), ('<User: user6>', {'diff': 46, 'alike': 1}), ('<User: user2>', {'diff': 48, 'alike': 1}), ('<User: user8>', {'diff': 49, 'alike': 1}), ('<User: user20>', {'diff': 50, 'alike': 0}), ('<User: user9>', {'diff': 50, 'alike': 0}), ('<User: user13>', {'diff': 50, 'alike': 0}), ('<User: user19>', {'diff': 50, 'alike': 0}), ('<User: user12>', {'diff': 50, 'alike': 0}), ('<User: user18>', {'diff': 50, 'alike': 0}), ('<User: user15>', {'diff': 50, 'alike': 0}), ('<User: user14>', {'diff': 50, 'alike': 0}), ('<User: user17>', {'diff': 50, 'alike': 0}), ('<User: user16>', {'diff': 50, 'alike': 0})])

注意,这里我们必须使用lambda语句作为键参数,因为itemgetter()不幸的是,它不能为我们获得多个级别的项。在

相关问题 更多 >