2015-12-07 111 views
2

在主字典中,日期是一個值。有同一日期的數據。所以然後我把日期和分組通過創建一個2維字典,其中日期是關鍵。按日期鍵排序python字典

data = { 
    "01-01-2015" : "some data", 
    "05-05-2015" : "some data", 
    "03-04-2015" : "some data" 
} 

現在我想通過日期降序排序,以便它看起來就像這樣:

data = { 
    "05-05-2015" : "some data", 
    "03-04-2015" : "some data", 
    "01-01-2015" : "some data" 
} 

我怎樣才能做到這一點?
我使用Python 2.6

+1

爲什麼''「03-04-2015」''在'「05-05-2015」之前? – styvane

+0

*按日期鍵?*第二個代碼塊是你期望的還是第一個是?順便說一句,你需要[OrderedDict](https://docs.python.org/3/library/collections.html#collections.OrderedDict)。 –

+3

一個簡單的谷歌/ stackoverflow搜索將清楚地告訴你,**一個Python字典不能被排序。** 必須使用不同的結構。 (ex-OrderedDict)。試試吧,讓我們知道。 – Shivendra

回答

5

的想法在這裏是用OrderedDictdictionary有訂貨,同時OrderedDict保留掛單無用武之地。

這裏的想法是使用list of tuples of (key, value) pairs,因爲dictionary沒有排序範圍,而OrderedDict保留了輸入順序。 此外,我們必須將鍵轉換爲實際的datetime對象爲了完美的工作,否則按字母順序排序基於字符串的字段。

代碼:

from datetime import datetime 
#from collections import OrderedDict 


data = { 
    "01-01-2015" : "some data", 
    "05-05-2015" : "some data", 
    "03-04-2015" : "some data" 
} 

#ordered_data = OrderedDict(
# sorted(data.items(), key = lambda x:datetime.strptime(x[0], '%d-%m-%Y'), reverse=True)) 

#Since OP is using python 2.6 where OrderedDict is not present, I changed the solution and the original solution is commented out 
ordered_data = sorted(data.items(), key = lambda x:datetime.strptime(x[0], '%d-%m-%Y'), reverse=True) 

print(ordered_data) 

輸出:

[('05-05-2015', 'some data'), ('03-04-2015', 'some data'), 
('01-01-2015', 'some data')] 

說明:(對於鍵轉換爲日期時間排序)

如果保留日期字段字符串然後是字典ord呃被考慮,並且30之後,因此a>bTrue,但是對於他們的日期對應物,情況並非如此。 Feb肯定是在Jan之後。

a = "30-01-2015" 
b = "01-02-2015" 

print(a>b) #True 

a_datetime = datetime.strptime(a, '%d-%m-%Y') 
b_datetime = datetime.strptime(b, '%d-%m-%Y') 

print(a_datetime>b_datetime) #False 
+0

對不起,但我忘了提及python版本。我使用的是2.6,OrderedDict來自2.7+ –

+0

只需使用 'ordered_data = sorted(data.items(),key = lambda x:datetime.strptime(x [0],'%d-%m-%Y '),reverse = True)'。 唯一的問題是你將無法使用字典的'鍵'優勢,因爲你會得到一個元組列表作爲輸出。 – Shivendra