2015-12-07 3 views
2

В главном словаре дата была значением. Имелись данные с той же датой. Итак, я взял дату и сгруппировал ее, создав двумерный dict, где дата - это ключ.Сортировка слова 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 "' before '" 05-05-2015 "'? – styvane

+0

* Ключ по дате? * Второй кодовый блок - ваш ожидаемый или первый? И, кстати, вам нужен [OrderedDict] (https://docs.python.org/3/library/collections.html#collections.OrderedDict). –

+3

Простой поиск google/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')] 

Объяснение: (Для преобразования ключей к 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 
+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

Смежные вопросы