【问题标题】:Python sorting a list of deeply nested dictionaries by valuePython按值对深度嵌套的字典列表进行排序
【发布时间】:2015-10-15 19:12:55
【问题描述】:

我有一个这样结构的字典列表。

[
    {
        '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)

我能做些什么来实现这个目标?

【问题讨论】:

标签: python list sorting dictionary


【解决方案1】:

您可以简单地使用带有key 参数的sorted() 方法对字典列表进行排序。

另外,我建议将字符串实际转换为 datetime 对象,然后再使用 datetime.datetime.strptime() 将其传递给 key 参数。

例子-

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

演示 -

>>> 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'}}]

【讨论】:

    猜你喜欢
    • 2021-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-08
    • 2014-05-01
    • 2016-04-30
    • 2022-01-27
    • 1970-01-01
    相关资源
    最近更新 更多