Я получаю значения в следующем формате
/a/b/c/d = "value1"
/a/b/e/f = "value2"
Я хочу, чтобы эти значения были в следующем формате.
{
"a": {
"b": {
{
"c": {
"d": "value1"
}
},
{
"e" {
"f": "value2"
}
}
}
}
}
Есть ли какие-либо встроенные функции в python, которые могут выполнять эту работу так же, как я? Такая структура невозможна в словаре python?
Выглядит немного хакерским, но если вы хотите пойти по маршруту a["b"]["c"]["d"]
, вы можете использовать для этого collections.defaultdict.
from collections import defaultdict
def defaultdict_factory():
return defaultdict(defaultdict)
a = defaultdict(defaultdict_factory)
a["b"]["c"]["d"] = "value1"
Встроенных нет, но можно reduce
каждое из этих выражений занести в словарь и потом получить их объединение.
from functools import reduce
data = """
/a/b/c/d = "value1"
/a/b/e/f = "value2"
"""
exp = dict()
for pathexp in data.strip().splitlines():
# skip past first "/" to avoid getting an empty element
path, value = pathexp.lstrip("/").rsplit(" = ", 1)
exp.update(
reduce(lambda x, y: {y: x}, reversed(path.split("/")),
value.strip('"')))
print(exp)
Если бы вы действительно хотели, вы могли бы сложить это в одну строку с другим reduce
вместо цикла; но если вы действительно не занимаетесь функциональным программированием, это уже довольно плотно.
Как было предложено в приведенном выше сообщении, я создал рекурсивную функцию, которая разделяет путь ["a/b/c"] и его значение ["value1"] и создает output_dict, который будет хранить все значения в формате json/dict.
resources = {"/a/b/c/d":"value1","/a/b/e/f":"value2"}
output_dict = {}
def create_nested_dict(path, value, output_dict):
"""Create a nested dictionary from the given path and value."""
keys = path.split("/")
if len(keys) == 1:
output_dict[keys[0]] = value
else:
key = keys[0]
if key not in output_dict:
output_dict[key] = {}
create_nested_dict("/".join(keys[1:]), value, output_dict[key])
for resource in resources:
for path,value in resource.items():
create_nested_dict(path[1:], value, output_dict)
Простым подходом было бы рассмотреть это как проблему рекурсии для путей, а затем записать ее в словарь.