2013-03-30 90 views
2

部分排序多詞典我有詞典這樣的:該鍵的的Python:通過鍵

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

部分是基於日期,在格式集合「%d%米%Y。」。需要按日期排序所有字典鍵。值必須以相同的格式保存。示例:

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

字典沒有訂單,所以無法排序。你想要輸出爲'(鍵,值)'元組列表嗎? –

+0

不知道這件事。好的,將其更改爲列表。謝謝! – Apache

回答

4

您無法對標準字典進行排序,但可以排序並顯示項目。

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'}} 
+0

非常好。 python is awsome – WeaselFox

+0

好的答案!儘管如此,稍微解釋一下你的'lambda'可能會有所幫助。 –

+0

lambda的解釋:取前8個字符:'k [:8]',並將它們分成'.'列表:'.split('。')',然後反轉列表:'[:: - 1] '。可以像這樣工作:'list(reversed(k [:8] .split(')。')))' – hughdbrown

2

大綱

使用sorted功能與key說法。編寫key函數將字符串轉換爲Datetime,並根據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/'] 

排序或按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')] 
1

作爲另一個選項,您可以結合使用OrderedDict以日期時間(由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'})]) 

你會得到正是你正在尋找的順序和日期的每個部分會相比,以規則的方式與其他日期的部分。

+0

帶分組的正則表達式比賽的順序有點模糊。這是約會!爲什麼不使用'Datetime'作爲關鍵? 'OrderedDict(sorted(d.items(),key = lambda t:datetime.strptime(t [0] [:8],「%d。%m。%y」)))' – hughdbrown

+0

好點。我會相應地改變它。 –

+0

+1祝你好運這個答案。 – hughdbrown