Ваш второй пример ввода / вывода содержит компоненты, которые соответствуют заголовку вопроса, а именно преобразование списков в словари с индексами списков в качестве ключей:
# input
"name": ["CONTAMINATION_SCORE", "TOTAL_SCORE"]
# output
"name": {
"0": "CONTAMINATION_SCORE",
"1": "TOTAL_SCORE"
}
Однако оба примера ввода / вывода содержат списки словарей, которые, как ожидается, будут преобразованы по-разному, то есть в словарь словарей с ключами в качестве перечислимых индексов записей словаря.
# input
"metrics": [{
...
"USL": 3106,
"UOM": "NA"
}]
# output
"metrics" : {
...
"3": {
"USL": 3106
},
"4": {
"UOM": "NA"
}
}
Это много слов, которые пытаются сформулировать по существу следующие два случая:
{[{'foo': 'bar'}]} => {'0': {'foo': 'bar'}}
{'foo': ['bar']} => {'foo': {'0': 'bar'}}
Это может быть источником неудачи для вас. Кроме того, ваша попытка найти решение повторяется только на самом верхнем уровне словаря. Вы должны рекурсивно пройти по словарю, если хотите воздействовать на записи на произвольных уровнях, то есть вам нужно что-то в форме:
from collections import abv
def update(d):
for k, v in d.copy().items():
if isinstance(v, abc.Mapping):
d[k] = update(v)
else:
d[k] = iv
return d
Используйте iteritems вместо элементов, если вы используете python 2, а не python 3. Кроме того, необходимо копировать, чтобы итератор не был аннулирован при изменении словаря.
Вы можете работать в перечислительном цикле, как вы изначально использовали для получения рабочего решения. Осторожно добавлять рекурсивные вызовы, чтобы повлиять на все уровни словаря. В совокупности это может выглядеть примерно так:
from collections import abc
def list_of_dict_to_dict(d):
dd = {}
for i, (key, val) in enumerate(d.copy().items()):
dd[i] = {}
if isinstance(val, abc.Mapping):
dd[i][key] = transform_dict(val)
elif isinstance(val, list):
dd[i][key] = list_to_dict(val)
else:
dd[i][key] = val
return dd
def list_to_dict(l):
d = {}
for i, val in enumerate(l):
if isinstance(val, abc.Mapping):
d[i] = transform_dict(val)
else:
d[i] = val
return d
def transform_dict(d):
for k, v in d.copy().items():
if isinstance(v, list):
if isinstance(v[0], abc.Mapping) and len(v) == 1:
d[k] = list_of_dict_to_dict(v[0])
else:
d[k] = list_to_dict(v)
elif isinstance(v, abc.Mapping):
d[k] = transform_dict(v)
else:
d[k] = v
return d
Предполагается, что список словарей всегда содержит один словарь. Не ясно, что вы ожидаете в других случаях.