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对象
另一种解决方案是使用
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循环(确保不要通过超出索引范围而溢出列表)。
希望这有帮助!
使用
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'}}] |