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.

¿Cuál es el algoritmo correcto para construir una lista de rutas de directorio?

Lo que tengo:

Tengo una lista de tuplas. El primer elemento de estas tuplas representa el nivel de una carpeta en un directorio, mientras que el segundo elemento representa el nombre de la carpeta. Estas tuplas también están ordenadas según su relación con el nivel anterior.

Así es como se ve la lista:

    single_paths = [
                      [0, "1st Top Level Folder"], 
                      [1, "1st Child To 1st Top Level Folder"],
                      [2, "1st Grandchild To 1st Child Folder"],
                      [2, "2nd Grandchild To 1st Child Folder"],
                      [1, "2nd Child To 1st Top Level Folder"],
                      [2, "1st Grandchild To 2nd Child Folder"],
                      [0, "2nd Top Level Folder"],
                      [1, "1st Child To 2nd Top Level Folder"],
                      [0, "3rd Top Level Folder"],
                   ]

Representación visual del árbol de directorios:

enter image description here

Lo que quiero lograr:
Una lista de todas las posibles rutas que se vea así:

possible_paths = [
["1st Top Level Folder"],
["1st Top Level Folder", "1st Child To 1st Top Level Folder"],
["1st Top Level Folder", "1st Child To 1st Top Level Folder", "1st Grandchild To 1st Child Folder"],
["1st Top Level Folder", "1st Child To 1st Top Level Folder", "2nd Grandchild To 1st Child Folder"],
["1st Top Level Folder", "2nd Child To 1st Top Level Folder"],
["1st Top Level Folder", "2nd Child To 1st Top Level Folder", "1st Grandchild To 2nd Child Folder"],
["2nd Top Level Folder"],
["2nd Top Level Folder", "1st Child To 2nd Top Level Folder"],
["3rd Top Level Folder"],
]

¿Qué algoritmo recomendaría para lograr esto? He pasado 3 días en esto y no puedo obtener el resultado correcto. Gracias por su ayuda de antemano.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Un posible algoritmo para lograr esto es:
    1. Definir un diccionario vacío llamado level_dict.
    2. Recorre cada tupla en la lista single_paths.
    3. Para cada tupla, extrae el nivel y el nombre de la carpeta.
    4. Si el nivel es 0, agrega el nombre de la carpeta como una clave en level_dict con una lista vacía como valor.
    5. Si el nivel no es 0, obtén el nombre de la carpeta padre accediendo al último nombre de carpeta agregado en level_dict para el nivel anterior.
    6. Agrega el nombre de la carpeta a la lista de la carpeta padre en level_dict.
    7. Finalmente, usa una función recursiva para generar todas las rutas posibles recorriendo level_dict y agregando cada nombre de carpeta a una lista de ruta actual hasta que se hayan visitado todas las carpetas hijas.

    Aquí tienes el código en Python que implementa este algoritmo:

    def obtener_rutas_posibles(single_paths):
        level_dict = {}
        for nivel, nombre_carpeta in single_paths:
            if nivel == 0:
                level_dict[nombre_carpeta] = []
                carpeta_anterior = nombre_carpeta
            else:
                carpeta_padre = level_dict[carpeta_anterior][-1]
                level_dict[carpeta_padre].append(nombre_carpeta)
                carpeta_anterior = nombre_carpeta
    
        def recorrer_level_dict(nombre_carpeta, ruta_actual):
            ruta_actual.append(nombre_carpeta)
            if nombre_carpeta not in level_dict:
                return [ruta_actual]
            else:
                todas_las_rutas = []
                for carpeta_hija in level_dict[nombre_carpeta]:
                    todas_las_rutas += recorrer_level_dict(carpeta_hija, ruta_actual.copy())
                return todas_las_rutas
    
        rutas_posibles = recorrer_level_dict(list(level_dict.keys())[0], [])
        return rutas_posibles
    

    Puedes llamar a esta función con tu lista single_paths:

    single_paths = [
                      [0, "1er Nivel de Carpeta Principal"], 
                      [1, "1er Hijo de la 1er Carpeta Principal"],
                      [2, "1er Nieto de la 1er Carpeta Hija"],
                      [2, "2do Nieto de la 1er Carpeta Hija"],
                      [1, "2do Hijo de la 1er Carpeta Principal"],
                      [2, "1er Nieto de la 2do Carpeta Hija"],
                      [0, "2do Nivel de Carpeta Principal"],
                      [1, "1er Hijo de la 2do Carpeta Principal"],
                      [0, "3er Nivel de Carpeta Principal"],
                   ]
    
    rutas_posibles = obtener_rutas_posibles(single_paths)
    print(rutas_posibles)
    

    Esto debería imprimir la lista deseada rutas_posibles.

Comments are closed.