gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 08:34:21 25 4
gpt4 key购买 nike

我有一个这样的列表:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com