【问题标题】:Sort list of long dictionaries [duplicate]长字典的排序列表[重复]
【发布时间】:2018-07-10 12:16:40
【问题描述】:

我有一个 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 示例,但找不到合适的解决方案来通过列表中字典元素的字典元素对列表元素进行排序。

你能给我一个线索吗?

【问题讨论】:

  • 你应该尽量不要使用list作为变量名,因为它是内置函数之一。
  • @James 非常正确,虽然list 实际上不是一个函数,它是一个类型(又名类)。

标签: python sorting


【解决方案1】:
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'}}]
  • 您可以在key 中使用lambda
  • 使用datetime.datetime.strptime(k['_source']["timestamp"], "%Y-%m-%dT%H:%M:%S")将字符串转换为日期时间对象

【讨论】:

  • 这是一个很好的解决方案,但将 lambda 分解为命名函数可能会更简洁
  • 我们是否需要将通用 ISO 时间戳转换为日期时间对象?字符串排序就足够了,不是吗?
【解决方案2】:

你可以这样做:

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

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

【讨论】:

  • 对 OP 数据中的 ISO 8601 时间戳进行简单的字符串比较就足够了,假设它们都使用相同的表示形式,则无需转换。
  • @PM2Ring 这是一个很好的观察
【解决方案3】:

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

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

请注意,这不会返回任何内容并就地对列表进行排序

【讨论】:

  • 或者arrow.Arrow
【解决方案4】:

使用dateutil 包解析日期时间并根据它进行排序。你可以通过pip install python-dateutil来安装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'}}]

【讨论】:

    【解决方案5】:

    我不确定您想如何对时间戳进行排序(从最早到最新或从最新到最早),但您可以通过以下方式进入第二个深度:

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

    如果要循环遍历整个列表,只需获取列表的长度并循环执行 for 循环(确保不会因超出索引范围而导致列表溢出)。

    我希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-30
      • 1970-01-01
      相关资源
      最近更新 更多