python, читать ключи из dict по размеру, чтобы построить их

У меня есть python dict, который содержит несортированные пары ключ / значение, где ключ - это datetime, а значение - int.

{"1.12.2015":5, "4.12.2015":3, "2.12.2015":6, ...}

Теперь я хочу прочитать ключи и их значения, отсортированные по дате, чтобы построить их с помощью pyplot.

Результат должен быть таким:

first pair:
1.12.2015 : 5
second: 
2.12.2015 : 6
third:
4.12.2015 : 3

вопрос в том, как лучше всего расположить даты и значения в правильном порядке. Было бы лучше, если бы была опция, работающая в python 2.6.


person mat    schedule 02.12.2015    source источник
comment
Возможный дубликат ключей словаря сортировки в python   -  person Dylan Lawrence    schedule 02.12.2015
comment
@Dylan Lawrence, это показывает сортировку по значениям, но я хочу отсортировать по ключу, или это можно сделать таким же образом?   -  person mat    schedule 02.12.2015
comment
См. Ответ: stackoverflow.com/questions/ 613183 /   -  person Dylan Lawrence    schedule 02.12.2015


Ответы (3)


Это более или менее то, что вы ищете?

data = {"1.12.2015":5, "4.12.2015":3, "2.12.2015":6}

from datetime import datetime

for k,v in sorted([(datetime.strptime(k, '%d.%m.%Y'), v) for k,v in data.iteritems()]):
    print datetime.strftime(k, '%d.%m.%Y'), v
person KT.    schedule 02.12.2015
comment
это то, что я искал, ты - person mat; 02.12.2015
comment
это создает список без причины, приводит к объектам datetime, а затем вызывает datetime.strftime, чтобы снова создать строку, я действительно не следую логике - person Padraic Cunningham; 02.12.2015
comment
@Padraic Cunningham метод for-loop + sorted - это то, что я искал. Поскольку даты хранятся как объекты datetime, мне не нужно приводить их, как в этом примере, что делает реальную реализацию намного чище. - person mat; 02.12.2015
comment
@mat, тогда вам просто нужно sorted(d) или sorted(d.items()), нет причин сначала создавать список или вызывать datetime.strftime, если бы вы что-то делали, вы бы вызывали strftime для объекта datetime или вызывали бы один из различных методов для получения строки представление - person Padraic Cunningham; 02.12.2015
comment
@PadraicCunningham: Вы правы. Однако обратите внимание, что в старых версиях Pythons d.items() создавал бы промежуточный список. Еще один промежуточный список составляет sorted() под прикрытиями. Следовательно, за кулисами создается целая куча промежуточных списков, и не очевидно, что версия с пониманием списка почему-то менее эффективна. Был выбран конкретный синтаксис (понимание списка вокруг iteritems), потому что он казался наиболее гибкой формой для построения примера. Ваша версия, безусловно, более лаконична. - person KT.; 02.12.2015
comment
В худшем случае можно было бы sorted((datetime.strptime(k, '%d.%m.%Y'), v) for k,v in data.iteritems()), я больше имел в виду преобразование в объекты datetime, а затем вызов datetime.strftime для обратного преобразования в строки. Если вы хотите использовать strftime, вы обычно вызываете его для объекта, но str(dt_object) также будет делать то же самое - person Padraic Cunningham; 02.12.2015
comment
Я так редко (т.е. никогда) использую strftime, я не подумал, что объект datetime имеет его как метод :) - person KT.; 02.12.2015

Используйте лямбда в качестве ключа для сортировки приведения каждого ключа к объекту datetime:

 from datetime import datetime

d = {"1.12.2015": 5, "4.12.2015": 3, "2.12.2015": 6}

for k in sorted(d, key=lambda x: datetime.strptime(x, "%d.%m.%Y")):
    print(k, d[k])

Вывод:

1.12.2015 5
2.12.2015 6
4.12.2015 3

В соответствии с вашим комментарием, если у вас уже есть объекты datetime, вы просто сортируете:

    for k in sorted(d):
        print(k, d[k])
person Padraic Cunningham    schedule 02.12.2015

ты можешь это сделать,

dic={"1.12.2015":5, "4.12.2015":3, "2.12.2015":6}
k = sorted(dic, key=lambda d: map(int, d.split('.')))
for i in k:
    print i," : ",dic[i]

ваше здоровье!

person sameera sy    schedule 02.12.2015
comment
почему ты timestamps=list(dic.keys())? - person Padraic Cunningham; 02.12.2015
comment
передавая временные метки в качестве параметра сортированной функции, в операторе печати нам нужно разделить словарь как список только дат для сортировки - person sameera sy; 02.12.2015
comment
Зачем вам создавать список или вызывать .keys, если на то пошло? Вы можете вызвать сортировку по словарю напрямую, нет необходимости создавать промежуточный список или вызывать .keys. - person Padraic Cunningham; 02.12.2015
comment
о да, мы можем использовать словарь только как итерируемый, по умолчанию ключ считается итерабельным, спасибо @PadraicCunningham - person sameera sy; 02.12.2015
comment
да sorted(dic... и забудьте метки времени - person Padraic Cunningham; 02.12.2015