如何以pythonic方式将原始json转换为所需格式

2024-04-28 21:00:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我有来自某个服务的json,其中每个值都是不同的行

输入示例:

[
    {'author': 'alf', 'topic': 'topic1', 'lang': 'ge', 'value': 11},
    {'author': 'alf', 'topic': 'topic1', 'lang': 'ge', 'value': 22},
    {'author': 'bob', 'topic': 'topic1', 'lang': 'ge', 'value': 33},
    {'author': 'bob', 'topic': 'topic1', 'lang': 'ge', 'value': 44},
    {'author': 'alf', 'topic': 'topic1', 'lang': 'fr', 'value': 99},
    {'author': 'alf', 'topic': 'topic2', 'lang': 'ge', 'value': -20},
]

输出示例:

{
    'alf': {
        'topic1': [
            {'ge': [11, 22]},
            {'fr': [99]}
        ],
        'topic2': [
            {'ge': [-20]}
        ]
    },
    'bob': {
        'topic1': [
            {'ge': [33, 44]}
        ]
    }
}

所以基本上这是一个简单的转换,通过分组指定的键将所有值收集到一个数组中

我通过检查并创建所需密钥(如果缺少)完成了此转换:

for entry in self._raw_data:
  parsed = {}
  author = entry["author"]
  topic = entry["topic"]
  lang = entry["lang"]
  value = entry["value"]
  if not parsed.get(author):
    parsed[author] = {}
  if not parsed[author].get(topic):
    parsed[author][topic] = []
  #etc

我相信,这可以以更透明的方式来实现。有人能推荐一些吗


Tags: 示例langtopicifvaluenotfrparsed
1条回答
网友
1楼 · 发布于 2024-04-28 21:00:36

如果您愿意将"topic"的值的类型从list更改为dict,可以使用^{}

res = {}
for entry in raw_data:
    res.setdefault(entry['author'], {}).setdefault(entry["topic"], {}).setdefault(entry["lang"], []).append(entry["value"])

输出:

{
    "alf": {
        "topic1": {
            "fr": [99],
            "ge": [11, 22]
        },
        "topic2": {
            "ge": [-20]
        }
    },
    "bob": {
        "topic1": {
            "ge": [33, 44]
        }
    }
}

相关问题 更多 >