Python 嵌套字典中的笛卡尔积

Python cartesian product in nested dict

我知道为了获得列表列表的组合,必须使用笛卡尔积,但在我的例子中,我需要结果是一个字典,其中嵌套了组合子组,这样我就可以使用结果作为递归 angular 指令的 JSON,显示嵌套在 N 个深度级别的元素。

这是一个数据输入示例:

[
    [{"cluster_id":1,"id":1,"name":"A"}, {"cluster_id":1,"id":2,"name":"B"}, {"cluster_id":1,"id":3,"name":"C"}],
    [{"cluster_id":2,"id":1,"name":"D"}, {"cluster_id":2,"id":2,"name":"E"}, {"cluster_id":2,"id":3,"name":"F"}],
    [{"cluster_id":3,"id":1,"name":"G"}, {"cluster_id":3,"id":2,"name":"H"}, {"cluster_id":3,"id":3,"name":"I"}]
]

结果应该是这样的:

[{"cluster_id":1,"id":1,"name":"A", "subcluster": [
        {"cluster_id":2,"id":1,"name":"D", "subcluster": [
                {"cluster_id":3,"id":1,"name":"G"},
                {"cluster_id":3,"id":2,"name":"H"},
                {"cluster_id":3,"id":3,"name":"I"},
            ]
        },
        {"cluster_id":2,"id":2,"name":"E", "subcluster": [
                {"cluster_id":3,"id":1,"name":"G"},
                {"cluster_id":3,"id":2,"name":"H"},
                {"cluster_id":3,"id":3,"name":"I"},
            ]
        },
        {"cluster_id":2,"id":3,"name":"F", "subcluster": [
                {"cluster_id":3,"id":1,"name":"G"},
                {"cluster_id":3,"id":2,"name":"H"},
                {"cluster_id":3,"id":3,"name":"I"},
            ]
        }
    ]
},
{"cluster_id":1,"id":2,"name":"B", "subcluster": [
        {"cluster_id":2,"id":1,"name":"D", "subcluster": [
                {"cluster_id":3,"id":1,"name":"G"},
                {"cluster_id":3,"id":2,"name":"H"},
                {"cluster_id":3,"id":3,"name":"I"},
            ]
        },
        {"cluster_id":2,"id":2,"name":"E", "subcluster": [
                {"cluster_id":3,"id":1,"name":"G"},
                {"cluster_id":3,"id":2,"name":"H"},
                {"cluster_id":3,"id":3,"name":"I"},
            ]
        },
        {"cluster_id":2,"id":3,"name":"F", "subcluster": [
                {"cluster_id":3,"id":1,"name":"G"},
                {"cluster_id":3,"id":2,"name":"H"},
                {"cluster_id":3,"id":3,"name":"I"},
            ]
        }
    ]
},
{"cluster_id":1,"id":3,"name":"C", "subcluster": [
        {"cluster_id":2,"id":1,"name":"D", "subcluster": [
                {"cluster_id":3,"id":1,"name":"G"},
                {"cluster_id":3,"id":2,"name":"H"},
                {"cluster_id":3,"id":3,"name":"I"},
            ]
        },
        {"cluster_id":2,"id":2,"name":"E", "subcluster": [
                {"cluster_id":3,"id":1,"name":"G"},
                {"cluster_id":3,"id":2,"name":"H"},
                {"cluster_id":3,"id":3,"name":"I"},
            ]
        },
        {"cluster_id":2,"id":3,"name":"F", "subcluster": [
                {"cluster_id":3,"id":1,"name":"G"},
                {"cluster_id":3,"id":2,"name":"H"},
                {"cluster_id":3,"id":3,"name":"I"},
            ]
        }
    ]
}]

我想知道如何尽可能使用 Pyhton 生成此输出,但欢迎任何帮助。

我终于用下面的递归函数解决了这个问题:

def generate_tree(filters, depth):
    if depth == len(filters)-1:
        return filters[depth]
    else:
        return [{'name': i['name'], 'id': i['id'], 'cycle_cluster_id': i['cycle_cluster_id'], 'subcluster': generate_tree(filters, depth+1)} for i in filters[depth]]