繁体   English   中英

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

[英]Python: sorting multilevel dictionary by part of 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/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'}

如果要使用列表:

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'})]

最后,如果您仍然想要字典行为,则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'}}

大纲

sorted函数与key参数一起使用。 写入将字符串转换为Datetime key函数,并根据Datetime排序。

def remap_key(key):
    from datetime import datetime
    a = key.split('/')[0]
    return datetime.strptime(a, "%d.%m.%y")

结果

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

或者在iteritemsiteritems

>>> 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')]

作为另一种选择,您可以将OrderedDict与datetime结合使用(如hughdbrown所述):

>>> from collections import OrderedDict
>>> from datetime import datetime
>>> d = {
   '28.10.11/D/text1/' : {'key1':'value1'},
   '27.01.11/D/text2/' : {'key2':'value2'},
   '07.11.12/D/text3/' : {'key3':'value3'}
}
>>> OrderedDict(sorted(d.items(), key=lambda t: datetime.strptime(t[0][:8], "%d.%m.%y")))

结果:

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

您将获得您正在寻找的订单,并且日期的每个部分将以常规方式与其他日期的相应部分进行比较。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM