python - 根据字符串拆分将列表拆分为子列表

标签 python json python-3.x list dictionary

我有一个这样的列表:

a = [['cat1.subcat1.item1', 0], ['cat1.subcat1.item2', 'hello], [cat1.subcat2.item1, 1337], [cat2.item1, 'test']]

所以可能有几个带有项目的子类别,用点分隔。但类别的数量和深度并不固定,类别之间也不相等。

我希望列表看起来像这样:

a = [['cat1', [
        ['subcat1', [
            ['item1', 0],
            ['item2', 'hello']
        ]],
        ['subcat2', [
            ['item1', 1337]
        ]],
    ]],
    ['cat2', [
        ['item1', 'test']
    ]]
]

我希望这是有道理的。

最后我需要一个 json 字符串。如果更简单,也可以直接转换为 json 字符串。

知道如何实现吗?谢谢!

最佳答案

您应该使用嵌套字典结构。这可以使用 collections.defaultdictfunctools.reduce 进行高效处理。

转换为普通字典是可能的,但通常不是必需的。

解决方案

from collections import defaultdict
from functools import reduce
from operator import getitem

def getFromDict(dataDict, mapList):
    """Iterate nested dictionary"""
    return reduce(getitem, mapList, dataDict)

tree = lambda: defaultdict(tree)
d = tree()

for i, j in a:
    path = i.split('.')
    getFromDict(d, path[:-1])[path[-1]] = j

结果

def default_to_regular_dict(d):
    """Convert nested defaultdict to regular dict of dicts."""
    if isinstance(d, defaultdict):
        d = {k: default_to_regular_dict(v) for k, v in d.items()}
    return d

res = default_to_regular_dict(d)

{'cat1': {'subcat1': {'item1': 0,
                      'item2': 'hello'},
          'subcat2': {'item1': 1337}},
 'cat2': {'item1': 'test'}}

解释

  • getFromDict(d, path[:-1]) 接受一个列表 path[:-1] 并递归地访问与字典中的列表项对应的字典值 d。我已经通过 functools.reduceoperator.getitem 在功能上实现了这一点。
  • 然后,我们从生成的字典树中访问键 path[-1],即列表的最后一个元素。这将是一个字典,因为 d 是字典的默认字典。然后我们可以将值 j 赋给这个字典。

关于python - 根据字符串拆分将列表拆分为子列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50328748/

相关文章:

javascript - 在 php 中解释 json 并将其传递给 mysql 时遇到问题

javascript - 在 Javascript/jQuery 中将大型 JSON 拆分为较小的部分

python - 如何替换图像中彩色对象的颜色?

python - kivy 中的音频位置没有改变

python - 带有字节顺序标记的 UTF-16 大端编码

python - 在 python 中使用神经网络预测时间序列数据

javascript - Json http.get nodejs 给出错误数据

python - Dreamhost + Passenger + Django 故障排除

python - 类似于 2to3 的工具,除了合并

python - 使用正则表达式替换文本文件中的多个条目