Python:按部分键对多级字典排序

Python:按部分键对多级字典排序,python,date,sorting,dictionary,key,Python,Date,Sorting,Dictionary,Key,我有这样的字典: { '28.10.11/D/text1/' : {key:value1}, '27.01.11/D/text2/' : {key:value2}, '07.11.12/D/text3/' : {key:value3} } 部分密钥基于日期,该日期以“%d.%m.%Y”格式设置。需要按日期对所有字典键进行排序。值必须以相同的格式保存。例如: { '27.01.11/D/text2/' : {key:value2}, '28.10.11/D/t

我有这样的字典:

{
   '28.10.11/D/text1/' : {key:value1},
   '27.01.11/D/text2/' : {key:value2},
   '07.11.12/D/text3/' : {key:value3}
}
部分密钥基于日期,该日期以“%d.%m.%Y”格式设置。需要按日期对所有字典键进行排序。值必须以相同的格式保存。例如:

{
   '27.01.11/D/text2/' : {key:value2},   
   '28.10.11/D/text1/' : {key:value1},
   '07.11.12/D/text3/' : {key:value3}
}

不能对标准词典进行排序,但可以对项目进行排序和显示

from datetime import datetime

D = {'28.10.11/D/text1/' : {'key':'value1'},
     '27.01.11/D/text2/' : {'key':'value2'},
     '07.11.12/D/text3/' : {'key':'value3'}}

for k in sorted(D,key=lambda k: datetime.strptime(k[:8],"%d.%m.%y")):
    print(k,D[k])
输出:

27.01.11/D/text2/ {'key': 'value2'}
28.10.11/D/text1/ {'key': 'value1'}
07.11.12/D/text3/ {'key': 'value3'}
[('27.01.11/D/text2/', {'key': 'value2'}),
 ('28.10.11/D/text1/', {'key': 'value1'}),
 ('07.11.12/D/text3/', {'key': 'value3'})]
{'27.01.11/D/text2/': {'key': 'value2'},
 '28.10.11/D/text1/': {'key': 'value1'},
 '07.11.12/D/text3/': {'key': 'value3'}}
如果要使用列表,请执行以下操作:

from datetime import datetime
from pprint import pprint

L = [('28.10.11/D/text1/' , {'key':'value1'}),
     ('27.01.11/D/text2/' , {'key':'value2'}),
     ('07.11.12/D/text3/' , {'key':'value3'})]

L.sort(key=lambda k: datetime.strptime(k[0][:8],"%d.%m.%y"))
pprint(L)
输出:

27.01.11/D/text2/ {'key': 'value2'}
28.10.11/D/text1/ {'key': 'value1'}
07.11.12/D/text3/ {'key': 'value3'}
[('27.01.11/D/text2/', {'key': 'value2'}),
 ('28.10.11/D/text1/', {'key': 'value1'}),
 ('07.11.12/D/text3/', {'key': 'value3'})]
{'27.01.11/D/text2/': {'key': 'value2'},
 '28.10.11/D/text1/': {'key': 'value1'},
 '07.11.12/D/text3/': {'key': 'value3'}}
最后,如果仍然需要字典行为,OrderedDict会记住插入的顺序键,因此:

from collections import OrderedDict
from datetime import datetime
from pprint import pprint

D = {'28.10.11/D/text1/' : {'key':'value1'},
     '27.01.11/D/text2/' : {'key':'value2'},
     '07.11.12/D/text3/' : {'key':'value3'}}

OD = OrderedDict(sorted(D.items(),
                 key=lambda k: datetime.strptime(k[0][:8],"%d.%m.%y"))
pprint(OD)
输出:

27.01.11/D/text2/ {'key': 'value2'}
28.10.11/D/text1/ {'key': 'value1'}
07.11.12/D/text3/ {'key': 'value3'}
[('27.01.11/D/text2/', {'key': 'value2'}),
 ('28.10.11/D/text1/', {'key': 'value1'}),
 ('07.11.12/D/text3/', {'key': 'value3'})]
{'27.01.11/D/text2/': {'key': 'value2'},
 '28.10.11/D/text1/': {'key': 'value1'},
 '07.11.12/D/text3/': {'key': 'value3'}}
轮廓 将
排序
函数与
参数一起使用。编写
函数,将字符串转换为
日期时间
,并根据
日期时间
进行排序

代码 结果 或在
iteritems
上排序:

>>> def remap_key(key_pair):
...     from datetime import datetime
...     key = key_pair[0]
...     a = key.split('/')[0]
...     return datetime.strptime(a, "%d.%m.%y")
... 
>>> sorted(d.iteritems(), key=remap_key)
[('27.01.11/D/text2/', 'a'), ('28.10.11/D/text1/', 'b'), ('07.11.12/D/text3/', 'c')]

作为另一个选项,您可以与datetime结合使用(如hughdbrown所述):

结果是:

OrderedDict([('27.01.11/D/text2/', {'key2': 'value2'}), ('28.10.11/D/text1/', {'key1': 'value1'}), ('07.11.12/D/text3/', {'key3': 'value3'})])

您将准确获得所需的顺序,并且日期的每个部分都将以常规方式与其他日期的相应部分进行比较。

字典没有顺序,因此无法排序。是否希望输出为
(键、值)
元组列表?不知道这一点。好的,把它改成列表。谢谢很不错的。python是一个很好的答案!不过,稍微解释一下你的
lambda
可能会有帮助。lambda的解释:取前八个字符:
k[:8]
,然后将它们在
上拆分为一个列表:
。拆分('.')
,然后反转列表:
[:-1]
。可以这样工作:
list(反转(k[:8].split('.'))
我认为强调键实际上是一个日期更有意义:
key=lambda k:datetime.strtime(k[:8],%d.%m.%y”)
Nice!但是需要在
key=lambda k:datetime.strtime(k[0][:8],%d.%m.%y”)中添加
[0]
带有分组以反转匹配顺序的正则表达式有点模糊。一言为定。为什么不使用
Datetime
作为键
OrderedDict(已排序(d.items(),key=lambda t:datetime.strtime(t[0][:8],%d.%m.%y))