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.

Python – Cómo generar todas las posibles formas en que una lista de 12 elementos puede dividirse en 3 listas de cualquier tamaño (incluidas las vacías)

Tengo 2 listas, una con 12 elementos y otra con 3 sub-listas.

a = [1,2,3,4,5,6,7,8,9,10,11,12]
b = [[],[],[]]

Necesito escribir código en Python que genere todas las posibles formas en las que se pueden distribuir los 12 elementos de a en las sub-listas de b. Hay 3^12 (poco más de medio millón) combinaciones. Por ejemplo, algunas combinaciones posibles serían las siguientes:

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

El orden no importa dentro de las listas. He intentado usar algunas funciones de itertools como permutation y combination, pero no parecen hacer lo que estoy buscando. Intenté lo siguiente:

import itertools

buildings = list(range(1,13)) # asignar a cada edificio un identificador único
building_arrangement = [list(range(1,13)),[],[]] # canteras, fábricas, mercados
all_arrangements.append(building_arrangement)

combos = itertools.combinations(buildings, 3)

for combo in combos:
    print(combo)

Pero lo anterior parece obtener la combinación de cada uno de los 12 números individualmente en lugar de tratar los 12 números como un conjunto y encontrar cada conjunto único que se puede hacer. No estoy seguro si esto se puede hacer con alguna librería preexistente, itertools no parece proporcionar una forma de hacer esto según lo que puedo ver en la documentación, pero podría estar equivocado.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Una posible solución para generar todas las formas posibles en las que los 12 elementos de ‘a’ pueden ser distribuidos entre las sub-listas en ‘b’ es mediante el uso de bucles anidados.

    a = [1,2,3,4,5,6,7,8,9,10,11,12]
    b = [[],[],[]]
    
    for i in range(3**len(a)):
        for j in range(len(a)):
            b[j%3].append(a[j//3**i%3])
        print(b)
        b = [[],[],[]]
    

    El bucle externo recorre todas las combinaciones posibles, que son 3^12. El bucle interno asigna cada elemento de ‘a’ a la sub-lista correspondiente en ‘b’, utilizando operaciones de división entera y módulo. Finalmente, se imprime la combinación actual y la lista ‘b’ se reinicia a un estado vacío.

    Esta solución genera todas las combinaciones posibles de 3^12, y puede manejar listas de cualquier tamaño, no solo 12 elementos. Sin embargo, puede que no sea la solución más eficiente para tamaños de entrada más grandes, ya que el número de bucles anidados y operaciones aritméticas crece exponencialmente con la longitud de ‘a’. En esos casos, puede ser más adecuado utilizar otros algoritmos o bibliotecas.

Comments are closed.