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