Я пытаюсь создать словарь на основе списка с динамическим размером.
parts = [['Sect', 'H1'],
['Sect', 'P'],
['Sect', 'P[2]'],
['Sect[2]', 'Sect', 'H2']]
Должен получиться такой словарь, как:
{
"Sect": {
"H1": {
},
"P": {
},
"P[2]": {
},
},
"Sect[2]": {
"Sect": {
"H2": {
}
}
}
}
Я не могу понять. Любая идея, как превратить список динамического размера в словарь с древовидной структурой?
Мой подход до сих пор:
for i, part in enumerate(parts):
if i == 0:
if part not in result:
result[part] = dict()
if i == 1:
if part not in result[parts[i-1]]:
result[parts[i-1]][part] = dict()
if i == 2:
if part not in result[parts[i-2]][parts[i-1]]:
result[parts[i-2]][parts[i-1]][part] = dict()
...
Но пока это не динамический подход.
Вы должны начать с попытки создать свой dict
только из одного списка. Когда вы поделитесь с нами этим кодом, мы сможем предложить вам следующий шаг.
Ответ - итерация. Вы можете перебирать список списков. И для каждого списка вы можете выполнить итерацию для создания иерархических dict
s.
parts = [['Sect', 'H1'],
['Sect', 'P'],
['Sect', 'P[2]'],
['Sect[2]', 'Sect', 'H2']]
data = {}
for part in parts:
d = data # refer to a current dict
for key in part:
new_dict = d[key] if key in d else {}
d[key] = new_dict
d = new_dict # recurse down the nested dicts
print(data)
Похож на ответ quamrana, но немного короче с dict.setdefault
.
d = {}
for p in parts:
inner = d
for k in p:
inner = inner.setdefault(k, {})
print(d) # {'Sect[2]': {'Sect': {'H2': {}}}, 'Sect': {'P[2]': {}, 'P': {}, 'H1': {}}}
Спасибо, что поделились своим вопросом. Что вы пробовали до сих пор, и какова структура списка ввода (
['Sect', 'H1']...
)? Это файл с несколькими строками списка?