【问题标题】:Convert a list of objects to a dictionary of lists将对象列表转换为列表字典
【发布时间】:2021-06-28 06:03:21
【问题描述】:

我有一个 JSON 对象列表,已经排序(比如说按时间排序)。每个 JSON 对象都有typestatus。例如:

[
    {'type': 'A', 'status': 'ok'},
    {'type': 'B', 'status': 'ok'},
    {'type': 'A', 'status': 'fail'}
]

我想把它转换成:

{
    'A': ['ok', 'fail'],
    'B': ['ok']
}

所以这当然是一项简单的任务,但我正在寻找 Pythonic 的方式来做到这一点,所以它可以节省我几行代码

【问题讨论】:

  • 也许可以分享您当前编写的代码,然后人们可以为您提供有关如何使其更好或更pythonic的指示

标签: python python-3.x list-comprehension dictionary-comprehension


【解决方案1】:

具有多个列表推导和sorted(set(…)) 删除重复键的单行:

original = [
    {"type": "A", "status": "ok"},
    {"type": "B", "status": "ok"},
    {"type": "A", "status": "fail"},
]

result = {
    key: [x["status"] for x in original if x["type"] == key]
    for key in sorted(set([x["type"] for x in original]))
}

输出:

{'A': ['ok', 'fail'], 'B': ['ok']}

【讨论】:

    【解决方案2】:

    我不知道是否有单行,但您可以使用setdefaultdefaultdict 来实现所需的结果:

    data = [
        {'type': 'A', 'status': 'ok'},
        {'type': 'B', 'status': 'ok'},
        {'type': 'A', 'status': 'fail'}
    ]
    

    使用setdefault()

    res = {}
    for elt in data:
        res.setdefault(elt['type'], []).append(elt['status'])
    

    输出:

    {'A': ['ok', 'fail'], 'B': ['ok']}
    

    使用defaultdict

    from collections import defaultdict
    res = defaultdict(list)
    for elt in data:
        res[elt['type']].append(elt['status'])
    

    输出:

    defaultdict(<class 'list'>, {'A': ['ok', 'fail'], 'B': ['ok']})
    

    【讨论】:

      【解决方案3】:

      由于您的新结构还依赖于旧的(已处理的)键,我怀疑您是否可以使用字典理解(基于每个键操作)来实现所需的最终状态。

      我更喜欢使用defaultdict,其中每个默认键都是一个列表。

      from collections import defaultdict
      new_data = defaultdict(list)
      for item in data:
          new_data[item['type']].append(item['status'])
      print(new_data)
      

      给出输出:

      defaultdict(<class 'list'>, {'A': ['ok', 'fail'], 'B': ['ok']})
      

      【讨论】:

        猜你喜欢
        • 2015-06-08
        • 1970-01-01
        • 2017-04-23
        • 2021-10-13
        • 2015-07-23
        • 1970-01-01
        • 2014-01-20
        • 2020-05-23
        相关资源
        最近更新 更多