数据转单层字典

发布时间 2023-04-08 00:36:59作者: NAVYSUMMER
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))