Python 3: Acoplar diccionarios y listas anidadas dentro de los diccionarios

Estoy tratando con un complejo diccionario anidado y una estructura de datos de lista. Necesito aplanar los datos y llevar todos los elementos anidados al nivel 0. Consulte el siguiente ejemplo para obtener más claridad:

{a:1,b:2,c:{c1:[{c11:1,c12:2,c13:3},{c21:1,c22:2,c23:3}],d1:[{d11:1,d12:2,d13:3},{d21:1,d22:2,d23:3}]},x:1,y:2}

Necesito aplanar esto para:

{a:1,b:2,c_c1_c11:1, c_c1_c12:2,c_c1_c13:3,c_c1_c21:1,c_c1_c22:2,c_c1_c23:3, c_d1,d11:1...and so on}

Tomé referencia de la primera respuesta enesta publicació, pero solo puede funcionar si he anidado diccionarios, y no si las listas están anidadas dentro de los diccionarios y hay más diccionarios anidados dentro de esas listas.

Modifiqué un poco el código para adaptarlo a mi caso de uso, pero este código no funciona

def flattenDict(d):
node_map = {}
node_path = []
def nodeRecursiveMap(d, node_path):
    for key, val in d.items():
        if ((type(val) is not dict)&(type(val) is not list)): 
            node_map['_'.join(node_path + [key])] = val
        if type(val) is list:
            def nodeListRecursion(val,node_path):
                for element in val:
                    if ((type(element) is not dict)&(type(element) is not list)) : node_map['_'.join(node_path + [key])] = element
                    if type(element) is list: nodeListRecursion(element,node_map)
                    if type(element) is dict: nodeRecursiveMap(element, node_path + [key])
            nodeListRecursion(val,node_path)
        if type(val) is dict: nodeRecursiveMap(val, node_path + [key])
nodeRecursiveMap(d, node_path)
return node_map

La sangría se está estropeando cuando pego mi código aquí. Pero realmente agradecería cualquier ayuda aquí.

Respuestas a la pregunta(1)

Su respuesta a la pregunta