【问题标题】:Sorting a List of Dictionaries by a timestamp field.按时间戳字段对字典列表进行排序。
【发布时间】:2019-01-20 12:11:30
【问题描述】:

我有一些从 API 收集字典对象列表的代码。字典键之一是在操作中看到规则的 last_timestamp。我希望能够按这个值排序,但是,我使用了常用的方法来排序,但都不起作用。

a = sorted(all_rules, key=itemgetter('last_timestamp'))

返回错误

    a = sorted(all_rules, key=itemgetter('last_timestamp'))
TypeError: list indices must be integers, not str

all_rules 是字典列表。

【问题讨论】:

  • 该错误消息使您看起来好像没有字典列表;至少你试图传递给你的 itemgetter 的一件事是一个列表。我怀疑在创建minimal reproducible example 的过程中,您会看到您的列表中有一个列表。
  • 我怀疑问题在于时间戳是真正的时间戳,即2018-12-08T15:00:00Z,而不是真正的整数。我想我需要找到一种方法将即时时间戳转换为 TimeStamp 的 Int 表示,然后排序并返回规则的 ID。
  • 您无需怀疑任何事情——错误消息会告诉您问题所在。您正在尝试使用字符串索引到列表中。请编辑您的问题以包含minimal reproducible example,并包含print(type(all_rules), set(type(obj) for obj in all_rules)) 的结果。

标签: python json python-2.7 list dictionary


【解决方案1】:

我尝试了以下方法,效果很好:

all_rules = [{'last_timestamp': 1}, {'last_timestamp': 0}, {'last_timestamp': 4}]

在您的示例中,问题可能是all_rules 是列表的集合,而不是字典的集合。在这种情况下,sorted 尝试将itemgetter('last_timestamp') 应用于每个列表,这会引发TypeError

如果您在all_rules 是字典集合的情况下应用相同的逻辑,它将返回按其'last_timestamp' 值排序的字典列表,只要该值是可比较的(即定义了__lt__ 方法),时间戳字符串满足的要求。

【讨论】:

  • 如果all_rules 是带有字符串键的字典,我认为错误消息将是TypeError: string indices must be integers, not str
  • 绝对是字典列表。我可以键入验证列表的元素和其中的项目。正如我上面所说,我可能正在苦苦挣扎,因为时间戳实际上是一个被认为是字符串的实际时间戳。
  • @DSM 对,你是,改变了它,并解决了时间戳或其字符串表示不能用于对列表进行排序的概念。
猜你喜欢
  • 2020-11-11
  • 2011-02-22
  • 2010-11-15
  • 2014-02-11
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
  • 2019-12-30
相关资源
最近更新 更多