Skip to main content
 首页 » 编程设计

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

2025年05月04日35del

我有一个这样的列表:

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.defaultdict 和 functools.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.reduce 和 operator.getitem 在功能上实现了这一点。
  • 然后,我们从生成的字典树中访问键 path[-1],即列表的最后一个元素。这将是一个字典,因为 d 是字典的默认字典。然后我们可以将值 j 赋给这个字典。