我有一个这样的列表:
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
赋给这个字典。
关于python - 根据字符串拆分将列表拆分为子列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50328748/