排序长字典列表

时间:2018-07-10 12:16:41

标签: python sorting

我有两个使用Python的词典的列表

list = [{'id' : 'ewsfsdf', 
           '_source' : 
                      {'timestamp':'2018-08-08T20:56:01', 
                       'bytes':'43534534'}},
         {'id' : 'ewsfsdz', 
           '_source' : 
                      {'timestamp':'2018-08-08T20:57:01', 
                       'bytes':'4354343534'}}]

我想按第二深度字典中的时间戳对列表元素进行排序。 我查找了许多其他的python示例,但找不到合适的解决方案来按列表中字典元素的字典元素对列表元素进行排序。

你能给我一个线索吗?

5 个答案:

答案 0 :(得分:5)

import datetime
l = [{'id' : 'ewsfsdf', 
           '_source' : 
                      {'timestamp':'2018-08-08T20:56:01', 
                       'bytes':'43534534'}},
         {'id' : 'ewsfsdz', 
           '_source' : 
                      {'timestamp':'2018-08-08T20:57:01', 
                       'bytes':'4354343534'}}]

print( sorted(l, key=lambda k: datetime.datetime.strptime(k['_source']["timestamp"], "%Y-%m-%dT%H:%M:%S")) )

print(sorted(l, key=lambda k: k['_source']['timestamp']))

输出:

[{'id': 'ewsfsdf', '_source': {'timestamp': '2018-08-08T20:56:01', 'bytes': '43534534'}}, {'id': 'ewsfsdz', '_source': {'timestamp': '2018-08-08T20:57:01', 'bytes': '4354343534'}}]
  • 您可以在lambda中使用key
  • 使用datetime.datetime.strptime(k['_source']["timestamp"], "%Y-%m-%dT%H:%M:%S")将字符串转换为日期时间对象

答案 1 :(得分:1)

您可以这样做:

print(sorted(list, key=lambda d: d['_source']['timestamp']))

根据您要按时间戳排序的方式,您可能需要将时间戳解析为在时间上可比的,而不仅仅是字典顺序的另一种格式。

答案 2 :(得分:1)

另一种解决方案是使用list方法sortdparser

from dateutil.parser import dparser
l.sort(key=lambda x: dparser.parse(x['_source']['timestamp']))

请注意,此操作将不返回任何内容并就地对列表进行排序

答案 3 :(得分:0)

使用dateutil包解析日期时间并根据日期时间对其进行排序。您可以通过执行dateutil

安装pip install python-dateutil软件包
from dateutil import parser
sorted(lst, key=lambda x: parser.parse(x['_source']["timestamp"]))
# [{'id': 'ewsfsdf', '_source': {'timestamp': '2018-08-08T20:56:01', 'bytes': '43534534'}}, {'id': 'ewsfsdz', '_source': {'timestamp': '2018-08-08T20:57:01', 'bytes': '4354343534'}}]

答案 4 :(得分:0)

我不确定您要如何对时间戳进行排序(从最早到最新,或者从最新到最早),但是这是您可以进入第二深度的方法:

list[0]['_source']['timestamp']

如果要遍历整个列表,只需获取列表的长度并遍历for循环即可(请确保不要超出索引范围,以免溢出列表)。

我希望这会有所帮助!