упорядочить список словарей по дате - PullRequest
2 голосов
/ 18 мая 2011

У меня есть следующий список:

l = [{datetime.date(2011, 4, 30): "Carrot"}, 
     {datetime.date(2009, 4, 12): "Banana"},
     {datetime.date(2012, 1, 1): "Corn"}]

Я хочу новый список со словарями, упорядоченными по дате (самое раннее):

l = [{datetime.date(2009, 4, 12): "Banana"},
     {datetime.date(2011, 4, 30): "Carrot"},
     {datetime.date(2012, 1, 1): "Corn"}]

Я ожидаю, что ответ включает sorted и key но я изо всех сил пытаюсь выделить ключ каждого словаря для использования в качестве компаратора.В других вопросах, которые ставят подобную проблему, словари имеют вид:

{'date':datetime.date(2009, 4, 12): "Banana"} 

Добавление строки date, кажется, облегчает задачу, но я хотел бы избежать ее, если это возможно

ура.

Ответы [ 3 ]

6 голосов
/ 18 мая 2011

Используйте ключ вашего внутреннего словаря в качестве ключа сортировки. Вы можете сделать это, передав функцию получения ключа в sorted, которая извлекает ключ даты из вашего словаря.

sorted(l, key=lambda v: v.keys()[0])
3 голосов
/ 18 мая 2011
print sorted(l) 

[{datetime.date(2009, 4, 12): 'Banana'}, {datetime.date(2011, 4, 30): 'Carrot'}, {datetime.date(2012, 1, 1): 'Corn'}]

фактически выполняет эту работу в этом случае.

Выбор более подходящей структуры данных, такой как кортеж или диктовка с ключами объяснения для даты и значения, будет здесь преимуществом, но, как сказано:разработка из коробки с использованием sorted ().

1 голос
/ 18 мая 2011

Вы должны использовать список кортежей или собрать эти данные в класс.В любом случае, чтобы получить итератор ключей с функцией .keys(), и получить любой член из него, преобразовав его в итерируемый и вызвать next() для него:

l.sort(key=lambda p:next(iter(p.keys())))

Если вы используете Python2.x, замените keys на iterkeys.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...