从字典列表中动态创建嵌套的json对象

问题描述 投票:0回答:1

我想将字典列表转换为嵌套的JSON。我想动态填充字段,我想将特定类别的所有信号分组。我尝试了不同的方法,但是无法生成所需的确切格式。需要一些逻辑帮助来生成JSON

我的输入

signal_list = [
    {'sig_id': 667, 'sig_name': 'RotorSpeed', 'Category': 'Gbox'},
    {'sig_id': 672, 'sig_name': 'GeneratorSpeed', 'Category': 'Genarator'},
    {'sig_id': 673, 'sig_name': 'NacelleSpeed', 'Category': 'Nacelle'},
    {'sig_id': 668, 'sig_name': 'RotorDirection', 'Category': 'Gbox'}
]

我尝试过的代码:

d = defaultdict(list)
for t in signals:
    field_list = d[t['Category']]
    new_d = {'sig_name': t['sig_name'], 'sig_id': t['sig_id'], 'Category': t['Category']}
    field_list.append(defaultdict(list, new_d))

当前输出

[
   {
      "Gbox":[
         {
            "sig_name":"RotorSpeed",
            "sig_id":667
         },
         {
            "sig_name":"RotorDirection",
            "sig_id":668
         }
      ]
   },
   {
      "Genarator":[
         {
            "sig_name":"GeneratorSpeed",
            "sig_id":672
         }
      ]
   },
   {
      "Signals":[
         {
            "sig_name":"NacelleSpeed",
            "SignalID":673
         }
      ]
   }
]

((必填)我的输出应如下所示

[
   {
      "Category":"Gbox",
      "Signals":[
         {
            "sig_name":"RotorSpeed",
            "sig_id":667
         },
         {
            "sig_name":"RotorDirection",
            "sig_id":668
         }
      ]
   },
   {
      "Category":"Genarator",
      "Signals":[
         {
            "sig_name":"GeneratorSpeed",
            "sig_id":672
         }
      ]
   },
   {
      "Category":"Nacelle",
      "Signals":[
         {
            "sig_name":"NacelleSpeed",
            "SignalID":673
         }
      ]
   }
]
python python-3.x list
1个回答
0
投票

请参考itertools文档,尤其是groupby功能。

groupby

输出:

import json
import itertools

dta = signal_list = [
    {'sig_id': 667, 'sig_name': 'RotorSpeed', 'Category': 'Gbox'},
    {'sig_id': 672, 'sig_name': 'GeneratorSpeed', 'Category': 'Genarator'},
    {'sig_id': 673, 'sig_name': 'NacelleSpeed', 'Category': 'Nacelle'},
    {'sig_id': 668, 'sig_name': 'RotorDirection', 'Category': 'Gbox'}
]

# this key is simply to be used on each dictionary to get the 'Category'
key = lambda dct: dct.get('Category')

# group works best with a sorted iterable. So let's sort by "Category' since that's
# your grouping key.
a = itertools.groupby(sorted(dta, key=key), key)

# groupby returns a generator like object that has tuples of (key, value)
# the value is also a generator like object that just has each item from the iterable
# that matches your grouping key. To get all the items we just turn them into a list
b = [{"Category": k, "Signals": list(v)} for k,v in a]

# using json to print it out in a nice format
print(json.dumps(b, indent=1))

如果我理解正确,您想从列表中的每个词典中删除“类别”键。你可以这样做。不幸的是,这种方法将从您的初始数据中删除类别键。

[
 {
  "Category": "Gbox",
  "Signals": [
   {
    "sig_id": 667,
    "sig_name": "RotorSpeed",
    "Category": "Gbox"
   },
   {
    "sig_id": 668,
    "sig_name": "RotorDirection",
    "Category": "Gbox"
   }
  ]
 },
 {
  "Category": "Genarator",
  "Signals": [
   {
    "sig_id": 672,
    "sig_name": "GeneratorSpeed",
    "Category": "Genarator"
   }
  ]
 },
 {
  "Category": "Nacelle",
  "Signals": [
   {
    "sig_id": 673,
    "sig_name": "NacelleSpeed",
    "Category": "Nacelle"
   }
  ]
 }
]
© www.soinside.com 2019 - 2024. All rights reserved.