按键排序defaultdict?

Han*_*pan -1 python

我按时间戳将对象列表分组在一起:

object_list = [
{
    timestamp: datetime.strptime("01/01/2014", "%d/%m/%y"),
},
{
    timestamp: datetime.strptime("12/05/2014", "%d/%m/%y"),
},
{
    timestamp: datetime.strptime("03/01/2014", "%d/%m/%y"),
},
{
    timestamp: datetime.strptime("01/01/2014", "%d/%m/%y"),
}]

date_grouped_objects = defaultdict(list)

for obj in object_list:
    date_grouped_objects[obj.timestamp].append(obj)
Run Code Online (Sandbox Code Playgroud)

这给了我我想要的东西,一个按时间戳属性组合在一起的对象列表.

问题:我现在想要通过键(时间戳)对date_grouped_objects进行排序,但是不清楚如何使用sorted来实现这一点?因此,最近日期的最多组将是最后一个

所以我要追求的是:

[
    ["01/01/2014"] = [...],
    ["03/01/2014"] = [...],
    ["12/05/2014"] = [...],
]
Run Code Online (Sandbox Code Playgroud)

键实际上是日期对象,而不是字符串.

use*_*740 6

像大多数Map实现一样,defaultdict没有排序1,因此它本身不能"排序".

但是,可以对包含的items()配对进行排序,结果是序列(列表),而不是映射(dict).这个可重复排序的元组,其中排序键首先出现,可以简单地排序,因为或者元组强加的默认排序是从左侧成对建立的.

d = {'c': 1, 'a': 2, 'b': 3}
s = sorted(d.items())
# s -> [('a', 2), ('b', 3), ('c', 1)]
Run Code Online (Sandbox Code Playgroud)

对于更复杂的情况,可以使用自定义比较函数或键选择器函数进行排序 ; 这两者都产生与上面相同的输出.

s = sorted(d.items(), lambda a, b: a[0] >= b[0])
s = sorted(d.items(), key = lambda i: i[0])
Run Code Online (Sandbox Code Playgroud)

1一种OrderedDict可用于保持插入排序,一旦键进行排序.

OrderedDict是一个dict,它记住了第一次插入键的顺序.

但是,我不建议在此特殊保证基础上使用算法.

import collections
od = collections.OrderedDict(s)
Run Code Online (Sandbox Code Playgroud)