2015-10-15 2 views
3

У меня есть список словарей, структурированных так.Python, сортирующий список глубоко вложенных словарей по значению

[ 
    { 
     'id': 1, 
     'last_message': { 
      'sent_at': '2015-10-15T17:48:52.515Z', 
      '...' : '...' 
     }, 
     '...' : '...', 
    }, 
    { 
     'id': 2, 
     'last_message': { 
      'sent_at': '2015-10-15T17:45:52.515Z', 
      '...' : '...' 
     }, 
     '...' : '...', 
    }, 
    { 
     'id': 3, 
     'last_message': { 
      'sent_at': '2015-10-15T17:43:52.515Z', 
      '...' : '...' 
     }, 
     '...' : '...', 
    } 
] 

И хочу, чтобы отсортировать список по ['last_message']['sent_at'].

Я попытался сделать такой способ вставки, но это приводит к бесконечному циклу.

ret = [] 
for conversation in conversations: 
    if len(ret) > 1: 
     for conv in ret: 
      if conversation['last_message']['sent_at'] > conv['last_message']['sent_at']: 
       ret.insert(ret.index(conv), conversation) 
       continue 
    else: 
     ret.append(conversation) 

Что я могу сделать для этого?

+5

Вы не изобретать колесо. То, что вы хотите, - это [ключевая функция] (https://wiki.python.org/moin/HowTo/Sorting#Key_Functions) и собственный 'sort' Python. –

+0

[Список сортировки dict] (http://stackoverflow.com/questions/72899/how-do-i-sort-a-list-of-dictionaries-by-values-of-the-dictionary-in-python) – sam

ответ

5

Вы можете просто использовать метод sorted() с аргументом key, чтобы отсортировать список словарей.

Кроме того, я бы рекомендовал преобразовать строку в объект datetime, прежде чем передать его ключевому аргументу, используя datetime.datetime.strptime().

Пример -

import datetime 
result = sorted(conversations, key=lambda x: datetime.datetime.strptime(x['last_message']['sent_at'],'%Y-%m-%dT%H:%M:%S.%fZ')) 

Demo -

>>> conversations = [ 
...  { 
...   'id': 1, 
...   'last_message': { 
...    'sent_at': '2015-10-15T17:48:52.515Z', 
...    '...' : '...' 
...   }, 
...   '...' : '...', 
...  }, 
...  { 
...   'id': 2, 
...   'last_message': { 
...    'sent_at': '2015-10-15T17:45:52.515Z', 
...    '...' : '...' 
...   }, 
...   '...' : '...', 
...  }, 
...  { 
...   'id': 3, 
...   'last_message': { 
...    'sent_at': '2015-10-15T17:43:52.515Z', 
...    '...' : '...' 
...   }, 
...   '...' : '...', 
...  } 
... ] 
>>> 
>>> import datetime 
>>> result = sorted(conversations, key=lambda x: datetime.datetime.strptime(x['last_message']['sent_at'],'%Y-%m-%dT%H:%M:%S.%fZ')) 
>>> pprint.pprint(result) 
[{'...': '...', 
    'id': 3, 
    'last_message': {'...': '...', 'sent_at': '2015-10-15T17:43:52.515Z'}}, 
{'...': '...', 
    'id': 2, 
    'last_message': {'...': '...', 'sent_at': '2015-10-15T17:45:52.515Z'}}, 
{'...': '...', 
    'id': 1, 
    'last_message': {'...': '...', 'sent_at': '2015-10-15T17:48:52.515Z'}}] 
Смежные вопросы