如何根据日期时间排序此字典?

问题描述:

我如何根据日期时间排序这个字典? 这可能吗?如何根据日期时间排序此字典?

{ 
1: {'l':{'created_on': datetime.datetime(2011, 9, 29, 17, 39, 26)}}, 
2: {'l':{'created_on': datetime.datetime(2011, 9, 23, 17, 39, 26)}}, 
3: {'l':{'created_on': datetime.datetime(2011, 9, 30, 17, 39, 26)}} 
} 

可以调用sorted()函数的值,以日期时间作为比较关键:

sorted(d.values(), key=lambda item: item["l"]["created_on"]) 
+2

如果你想保留所有信息:sorted(d.items(),key = lambda k,it:it [“l”] [“created_on”]) – rocksportrocker

+1

你可以在那里包装@rocksportrocker方法'OrderedDict()'如果你想把它作为一个映射。 – agf

无法排序的字典()本身。该字典有没有隐式的顺序:

>>> print dict(a=3, b=2, c=1) 
{'a': 3, 'c': 1, 'b': 2} 

如果你想保持你的字典的完整结构,你必须汇整字典dd为第一列表li。然后,你可以用datetime值作为密钥进行排序:

import operator 

dd = { 1: ..... } 

li = [] 

for (i, it) in dd.items(): 
    for (l, it1) in it.items(): 
     for (c, dt) in it.items(): 
      li.append((i, l, c, dt)) 
li.sort(key=operator.itemgetter(3)) 

print li 
+0

我没有看到这个版本如何保持完整的结构,或者'sorted(d.items()...'如何失败?尤其是它可以用OrderedDict封装来获得映射,而这不能, – agf

+0

它保留了第一级的键,如果你迭代的值() – rocksportrocker

+0

好了,但如果你使用'items()'不平坦,但保留深度'dict' - 所以说你必须把它弄平它是错误的,你应该真的把这个评论加入到这个答案中,因为这是做这件事的最好方法。 – agf

你可以得到钥匙的排序列表为你的字典d(字典本身不能进行排序):

>>> sorted(d.keys(), key=lambda k: d[k]['l']['created_on']) 
[2, 1, 3] 

PS:如果你真的需要一个带有排序键的字典,现在标准的OrderedDict类型是你的朋友(正如在frédéric的回答之后由rocksportrocker和agf发表的评论中所描述的那样)。