def data2single_dict(source, parent_name: str = ""):
result = {}
if isinstance(source, dict):
for k, v in source.items():
column_name = f"{parent_name}.{k}" if parent_name else k
if isinstance(v, dict):
result.update(data2single_dict(v, column_name))
elif isinstance(v, list) or isinstance(v, tuple):
for i, vv in enumerate(v):
cn = f"{column_name}.{i}"
result.update(data2single_dict(vv, cn))
else:
result[column_name] = v
elif isinstance(source, list) or isinstance(source, tuple):
for i, v in enumerate(source):
column_name = f"{parent_name}.{i}" if parent_name else f"{i}"
if isinstance(v, dict):
result.update(data2single_dict(v, column_name))
elif isinstance(v, list) or isinstance(v, tuple):
for vv in v:
result.update(data2single_dict(vv, column_name))
else:
result[column_name] = v
else:
result[parent_name] = source
return result
data1 = {
"a": {
"b": {
"c": 1
},
"d": 2
},
"e": 3
}
data2 = {
"a": {
"b": {
"c": [1, 2, 3]
},
"d": [4, 5, 6]
},
"e": [7, 8, 9],
"f": 10
}
data3 = [{
"a": {"b": "c"},
"d": [1, 2, 3],
"f": [{"g": 4}, "5", 6]
}]
data4 = [{
"a": {"b": "c"},
"d": [[-1, -2], 2, 3],
"f": [{"g": 4}, "5", 6]
}]
result = {
"a.b.c.0": 1,
"a.b.c.1": 2,
"a.b.c.2": 3,
"a.d.0": 4,
"a.d.1": 5,
"a.d.2": 6,
"e.0": 7,
"e.1": 8,
"e.2": 9
}
print(data2single_dict(data1))
print(data2single_dict(data2))
print(data2single_dict(data3))
print(data2single_dict(data4))