我有一个看起来像这样的元组:
(
('Category 1', 40),
('Category 1 | Sub-Category 1', 20),
('Category 1 | Sub-Category 2', 20),
('Category 1 | Sub-Category 2 | Sub-Sub-Category 1', 5),
('Category 1 | Sub-Category 2 | Sub-Sub-Category 2', 15),
('Category 2', 20),
('Category 2 | Sub-Category 1', 15),
('Category 2 | Sub-Category 2', 5)
)
我想把它变成一个看起来像这样的字典:
{
'Category 1': {
'count': 40,
'children': {
'Sub-Category 1': {'count': 20, 'children': []},
'Sub-Category 2': {
'count': 20,
'children': {
'Sub-Sub-Category 1': {'count': 5, 'children': []},
'Sub-Sub-Category 2': {'count': 15, 'children': []}
}
}
}
},
'Category 2': {
'count': 20,
'children': {
'Sub-Category 1': {'count': 15, 'children': []},
'Sub-Category 2': {'count': 5, 'children': []},
}
}
}
有任意数量的子类别。我很难想到Pythonic这样做的方式。有什么建议吗?
编辑:如果有其他人遇到这类问题而想要一个解决方案,这就是我(最终)想出来的。我会发布答案,但不能,因为问题被关闭(叹气)。
from itertools import groupby
def categoriesdict(value, depth=0):
categories = {}
for name, children in groupby(value, lambda c: c[0].split(' | ')[depth]):
# assumes that the first child is the group info
categories[name] = {
'count': children.next()[1],
'children': categoriesdict(children, depth + 1)
}
return categories
答案 0 :(得分:2)
对于每个2元组,拆分第一个元组[el.strip() for el in path.split('|')]
,然后按照该路径创建字典和子词典。
我会在几分钟内编辑一些代码。
d = {'count': 0, 'children': {}}
for (path, count) in els:
path = [el.strip() for el in path.split('|')]
here = d
for el in path:
print(el)
if el not in here['children']:
here['children'][el] = {'count': 0, 'children': {}}
here = here['children'][el]
here['count'] = count