我按时间戳将对象列表分组在一起:
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)
这正是我想要的,一个按时间戳属性组合在一起的对象列表。
问题:我现在想通过键(时间戳)对date_grouped_objects进行排序,但目前尚不清楚如何使用sorted来实现这一目标?因此,具有最新日期的最多组将是最后一次
所以我追求的是:
[
["01/01/2014"] = [...],
["03/01/2014"] = [...],
["12/05/2014"] = [...],
]
其中键实际上是日期对象,而不是字符串。
答案 0 :(得分:6)
与大多数Map实现一样,defaultdict
不是 1 ,因此它本身不能“排序”。
但是,可以对包含的items()
配对进行排序,结果是序列(列表),而不是映射(dict)。这个可重复排序的元组,其中排序键首先出现,可以简单地进行排序,因为或者元组强加的默认排序是从左侧成对建立的。
d = {'c': 1, 'a': 2, 'b': 3}
s = sorted(d.items())
# s -> [('a', 2), ('b', 3), ('c', 1)]
对于更复杂的情况,可以使用自定义比较函数或键选择器函数for the sort;这两者都产生与上面相同的输出。
s = sorted(d.items(), lambda a, b: a[0] >= b[0])
s = sorted(d.items(), key = lambda i: i[0])
1 一旦密钥被排序,OrderedDict可用于维护插入排序。
OrderedDict是一个记住首次插入密钥的顺序的字典。
但是,我不建议在此特殊保证基础上使用算法。
import collections
od = collections.OrderedDict(s)
答案 1 :(得分:4)
您可以使用我another answer的OrderedDefaultdict
类来执行以下操作:
from datetime import datetime
from ordereddefaultdict import OrderedDefaultdict
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 = OrderedDefaultdict(list)
for obj in sorted(object_list):
key = obj['timestamp'].strftime("%d/%m/%Y") # convert datetime to string
date_grouped_objects[key].append(obj)
for key, value in date_grouped_objects.iteritems():
print '[{!r}] = {}'.format(key, value)
输出:
['01/01/2014'] = [{'timestamp': datetime.datetime(2014, 1, 1, 0, 0)},
{'timestamp': datetime.datetime(2014, 1, 1, 0, 0)}]
['03/01/2014'] = [{'timestamp': datetime.datetime(2014, 1, 3, 0, 0)}]
['12/05/2014'] = [{'timestamp': datetime.datetime(2014, 5, 12, 0, 0)}]
答案 2 :(得分:0)
使用内置排序方法。它适用于值和键。您可以使用复杂排序的键和反向参数