Python 如何复制MongoDB';s在嵌套字典中动态展开功能

Python 如何复制MongoDB';s在嵌套字典中动态展开功能,python,python-3.x,Python,Python 3.x,我希望以这样一种方式规范化数据:数组中的任何值都会导致两个单独的dictionary对象,这样每个期望的键都有一个关联的值 为了获取一个有助于突出显示我想要的I/O的示例用例,让我们假设我正在尝试展平一个嵌套的JSON对象 现在,在我看到的大多数示例中,我遍历嵌套字典并递归调用一个函数,如果键值对中的值是dict,则该函数将键名与任何类型的分隔符连接起来,如果是列表,则使用索引值代替键名,如果这两种类型都不是iterable,只需将对象干净地传递出去 例如,以下示例dict: [ {

我希望以这样一种方式规范化数据:数组中的任何值都会导致两个单独的dictionary对象,这样每个期望的键都有一个关联的值

为了获取一个有助于突出显示我想要的I/O的示例用例,让我们假设我正在尝试展平一个嵌套的JSON对象

现在,在我看到的大多数示例中,我遍历嵌套字典并递归调用一个函数,如果键值对中的值是dict,则该函数将键名与任何类型的分隔符连接起来,如果是列表,则使用索引值代替键名,如果这两种类型都不是iterable,只需将对象干净地传递出去

例如,以下示例dict:

[
    {
        "fruit": {
            "type": "apple",
            "color": "green"
        }
    },
    {
        "fruit": {
            "type": "pear",
            "color": "yellow"
        }
    },
    {
         "fruit": {
            "type": "grape",
            "color": ["red", "green"]
        }
    }
]
理想情况下,可能会返回与此更接近的内容:

[
    {
        "fruit.type": "apple",
        "fruit.color": "green"
    },
    {
        "fruit.type": "pear",
        "fruit.color": "green"
    },
    {
        "fruit.type": "grape",
        "fruit.color": "green"
    },
    {
        "fruit.type": "grape",
        "fruit.color": "red"
    }
]
请注意,大多数用例都会将“葡萄”字典转换为与以下内容更相似的内容:

{
    "fruit.type": "grape",
    "fruit.color.1": "green",
    "fruit.color.2": "red"

}
这是不可取的。我使用的此类代码示例如下:

def flatten_json(dictionary):
out = {}

def flatten(object, name=""):

    if type(object) is dict:

        for key in object:
            flatten(object[key], name + key + ".")

    elif type(object) is list:

        i = 0
        for element in object:
            flatten(element, name + str(i) + ".")
            i += 1

    else:
        out[name[:-1]] = object

flatten(dictionary)
return out
对于上下文,底层用例是确保我识别行为或记录的完全唯一实例,以便在多种类型的数据集之间进行更灵活的表示(例如在datatable/csv中)、排序、分组等。我更希望有4条记录,其中每个值都是单数(即没有数组/可数)