【问题标题】:Sort a list of dictionaries by a specific key within a nested list of dictionaries按嵌套字典列表中的特定键对字典列表进行排序
【发布时间】:2021-10-27 21:09:15
【问题描述】:

我有一个字典列表,每个条目都具有以下结构

{
  "id": 0,
  "type": "notification",
  "name": "jane doe",
  "loc": {
    "lat": 38.8239,
    "long": 104.7001
  },
  "data": [
    {
      "type": "test",
      "time": "Fri Aug 13 09:17:16 2021",
      "df": 80000000,
      "db": 1000000,
      "tp": 92
    },
    {
      "type": "real",
      "time": "Sat Aug 14 09:21:30 2021",
      "df": 70000000,
      "db": 2000000,
      "tp:": 97
    }
  ]
}

我需要能够通过以下任意键对该列表进行排序:name, type, time, tp 并将其返回到内存中。

我了解如何按顶级键 sorted(json_list, key=lambda k:k['name']) 甚至嵌套键进行排序。例如通过 lat sorted(json_list, key=lambda k:k['loc']['lat'])

所以目前我有一个功能适用于按name 排序时的情况。

  def sort_by(self, param, rev=False):
    if param == NAME:
      self.json_list = sorted(self.json_list, key=lambda k: k[param], reverse=rev)
    else:
      #  need help here

我无法按type, time, and tp 排序。注意data 键也是一个字典列表。如果可能,我想利用标准库中内置的现有方法。如有必要,我可以提供更多说明

更新:

  def sort_by(self, param, rev=False):
    if param == NAME:
      self.json_list = sorted(self.json_list, key=lambda k: k[param], reverse=rev)
    else:
      self.json_list = sorted(self.json_list, key=lambda k: k['data'][0][param], reverse=rev)

    return self.json_list

如果data 列表中只有一项,这将正常工作

【问题讨论】:

  • 如果您提供data 中的列表包含多个元素的示例,将会有所帮助。

标签: sorting dictionary data-structures nested-lists


【解决方案1】:

如果json_list[i]['data'](对于每个i)只包含一个dict,那么以下应该可以工作;否则需要修改。

sorted(json_list, key = lambda k: (
    k['name'], k['data']['type'], k['data']['time'], k['data']['tp']
))

【讨论】:

  • 我认为这行不通,因为 data 是一个列表。很确定这会引发 TypeError。
  • 我也看到你认为我的意思是我需要一次按所有这些键排序。我实际上一次只需要按一个键排序。不是组合。感谢您提出这个问题,以便我完善我的问题!
  • 在您的更新中,我看到您至少可以使用蛮力 if-elif-else 来处理不同的键,具体取决于参数。那么如果数据列表有多个元素呢?
猜你喜欢
  • 2019-02-08
  • 1970-01-01
  • 1970-01-01
  • 2021-03-08
  • 1970-01-01
  • 1970-01-01
  • 2022-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多