关于python:长字典的排序列表

Sort list of long dictionaries

本问题已经有最佳答案,请猛点这里访问。

我有一个用python编写的两本字典的列表

1
2
3
4
5
6
7
8
list = [{'id' : 'ewsfsdf',
           '_source' :
                      {'timestamp':'2018-08-08T20:56:01',
                       'bytes':'43534534'}},
         {'id' : 'ewsfsdz',
           '_source' :
                      {'timestamp':'2018-08-08T20:57:01',
                       'bytes':'4354343534'}}]

我想根据第二深度字典中的时间戳对list元素进行排序。我查找了许多其他关于python的例子,但是找不到一个合适的解决方案来通过列表中dictionary元素的dictionary元素来排序list元素。

你能给我个线索吗?


1
2
3
4
5
6
7
8
9
10
11
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")) )

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

输出:

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


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

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

请注意,这将不返回任何内容,而是就地对列表进行排序。


你可以做到:

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

根据您希望如何按时间戳排序,您可能需要将时间戳解析为另一种具有可比性的时间格式,而不仅仅是词典编纂顺序。


我不知道您希望如何对时间戳进行排序(从最早到最晚或从最晚到最早),但下面是您可以进入第二个深度的方法:

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

如果您想循环浏览整个列表,只需获取列表的长度并循环浏览for循环(确保不要通过超出索引范围而溢出列表)。

希望这有帮助!


使用dateutil包来分析日期时间,并根据日期时间对其进行排序。您可以通过执行pip install python-dateutil来安装dateutil包。

1
2
3
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'}}]