按键排序defaultdict?

时间:2014-06-23 22:08:15

标签: 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)

这正是我想要的,一个按时间戳属性组合在一起的对象列表。

问题:我现在想通过键(时间戳)对date_grouped_objects进行排序,但目前尚不清楚如何使用sorted来实现这一目标?因此,具有最新日期的最多组将是最后一次

所以我追求的是:

[
    ["01/01/2014"] = [...],
    ["03/01/2014"] = [...],
    ["12/05/2014"] = [...],
]

其中键实际上是日期对象,而不是字符串。

3 个答案:

答案 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 answerOrderedDefaultdict类来执行以下操作:

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)

使用内置排序方法。它适用于值和键。您可以使用复杂排序的键和反向参数