我按时间戳将对象列表分组在一起:
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)
键实际上是日期对象,而不是字符串.
像大多数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)