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"]
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óncombinations
deitertools
para generar todas las combinaciones posibles de nodos en el grafo. A continuación, se muestra un fragmento de código que logra esto: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óncombinations
deitertools
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.
Este código debería producir la salida deseada:
Nota que la salida está ordenada por la longitud de la combinación, con las combinaciones más largas primero.