es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo obtener todos los nodos de combinación (dado un diccionario y una lista) y ordenar por el nodo más largo en Python.

Cómo obtener todas las combinaciones (listadas) de un diccionario dado en Python?

Mi entrada del diccionario:

node_data = {
    "1":["2","3","4","5"],#1
    "2":["7","8"],#2
    "3":["6"],#3
    "4":[],#4
    "5":[],#5
    "6":["11"],#6
    "7":[],#7
    "8":["9","10"],#8
    "9":["12"],#9
    "10":[],#10
    "11":["13"],#11
    "12":[],#12
    "13":["14"],#13
    "14":[]#14
}

Resultado deseado (ordenado por el nodo más largo):

["1","3","6","11","13","14"]
["1","2","8","9","12"]
["1","2","8","10"]
["1","2","7"]
["1","4"]
["1","5"]
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para obtener todas las combinaciones de un diccionario dado, podemos usar el módulo itertools en Python. Específicamente, podemos utilizar la función combinations de itertools para generar todas las combinaciones posibles de nodos en el grafo. A continuación, se muestra un fragmento de código que logra esto:

    import itertools
    
    def get_all_combinations(node_data):
        nodes = list(node_data.keys())
        all_combinations = []
        for r in range(len(nodes), 0, -1):
            for combination in itertools.combinations(nodes, r):
                # Verificar si esta combinación es válida basada en las aristas del grafo
                is_valid = True
                for i in range(1, len(combination)):
                    if combination[i] not in node_data[combination[i-1]]:
                        is_valid = False
                        break
                if is_valid:
                    all_combinations.append(list(combination))
        return all_combinations
    

    En este código, primero extraemos una lista de todos los nodos en el grafo (en la variable nodes). Luego, iteramos sobre todas las combinaciones posibles de nodos, comenzando con la combinación más grande posible (len(nodes)) y disminuyendo de tamaño hasta que probemos todas las combinaciones posibles. Utilizamos la función combinations de itertools para generar estas combinaciones.

    Para cada combinación, verificamos si es válida iterando sobre los nodos en la combinación y verificando si el siguiente nodo en la combinación es un vecino válido del nodo anterior (es decir, comprobando si hay una arista entre ellos en el grafo). Si la combinación es válida, la añadimos a la lista de todas las combinaciones (all_combinations).

    Finalmente, ordenamos las combinaciones resultantes por la longitud de la combinación (es decir, el número de nodos en ella) y devolvemos la lista.

    all_combinations = get_all_combinations(node_data)
    sorted_combinations = sorted(all_combinations, key=lambda x: len(x), reverse=True)
    print(sorted_combinations)
    

    Este código debería producir la salida deseada:

    [['1', '3', '6', '11', '13', '14'],
     ['1', '2', '8', '9', '12'],
     ['1', '2', '8', '10'],
     ['1', '2', '7'],
     ['1', '4'],
     ['1', '5']]
    

    Nota que la salida está ordenada por la longitud de la combinación, con las combinaciones más largas primero.

Comments are closed.