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))