Идея заключается в том, чтобы использовать в качестве OrderedDict
dictionary
не имеет возможности для заказа, а 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')]
Объяснение: (Для преобразования ключей к DateTime для сортировки)
Если держать поле даты в строка, то лексикографические орды er считается и 3
приходит после 0
, следовательно a>b
- True
, но это не относится к их дате. 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
Почему '' 03-04-2015 "' before '" 05-05-2015 "'? – styvane
* Ключ по дате? * Второй кодовый блок - ваш ожидаемый или первый? И, кстати, вам нужен [OrderedDict] (https://docs.python.org/3/library/collections.html#collections.OrderedDict). –
Простой поиск google/stackoverflow скажет вам, что ** словарь python не может быть отсортирован. ** Необходимо использовать другую структуру. (ex-OrderedDict). Попробуйте и сообщите нам. – Shivendra