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.

Creando combinaciones con Python

Soy nuevo en la programación.
Para practicar mi aprendizaje, intento crear algunos códigos básicos.
Sé que existen diferentes soluciones listas para usar para mi problema.
Intento crear un programa de combinaciones.
El programa creará automáticamente todas las combinaciones relacionadas con una lista.

Mi código es el siguiente:

MainList=[1,2,3]

CombinationList=[]

def createcombinations(List):
CombinationList.append(List)
for i in range(0,(len(List)-1)):
NewCombination=[]
TemporaryRemove=List[i]
List.pop(i)
NewCombination=List.copy()
List.insert(i,TemporaryRemove)
CombinationList.append(NewCombination)
if len(NewCombination)>1:
createcombinations(NewCombination)

createcombinations(MainList)
print(CombinationList)

Espero obtener una lista como la siguiente:

[[1,2,3],[1,2],[2,3],[1,3],[1],[2],[3]]
(No espero este orden exacto).

Sin embargo, la salida del código anterior es la siguiente:

[[1, 2, 3], [2, 3], [2, 3], [3], [1, 3], [1, 3], [3]]

¿Qué estoy haciendo mal?

Nota de edición: Gracias @Barmar y @laenNoCode por señalar el problema de la lista y actualizarlo. Puedes ver la versión actualizada arriba. Y también hice algunas actualizaciones más…

También, gracias a @Corralien por su comentario. Como dije, soy muy nuevo en la programación (apenas en el primer mes). La semana pasada solo estaba usando x1, x2, etc. 🙂 Leeré la guía de estilo, gracias por el enlace.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Hay algunos problemas con tu código que están causando una salida inesperada.

    En primer lugar, cuando agregas la lista original a CombinationList, en realidad estás agregando una referencia a la lista original en lugar de una copia de esta. Esto significa que cuando modificas la lista más adelante, las modificaciones se reflejan en la lista que ya fue agregada a CombinationList. Para solucionar esto, puedes crear una copia de la lista antes de agregarla a CombinationList, así: CombinationList.append(List.copy())

    En segundo lugar, cuando eliminas un elemento de la lista (List.pop(i)), los índices de los elementos restantes cambian. Esto significa que el índice i ya no apunta al elemento que pretendías eliminar. Para solucionar esto, puedes recorrer los índices en orden inverso, así: for i in reversed(range(len(List)))

    Aquí está el código actualizado:

    MainList = [1, 2, 3]
    
    CombinationList = []
    
    def createcombinations(List):
        CombinationList.append(List.copy())
        for i in reversed(range(len(List))):
            NewCombination = []
            TemporaryRemove = List[i]
            List.pop(i)
            NewCombination = List.copy()
            List.insert(i, TemporaryRemove)
            if len(NewCombination) > 1:
                createcombinations(NewCombination)
                CombinationList.append(NewCombination.copy())
    
    createcombinations(MainList)
    print(CombinationList)
    

    Esto debería darte la salida esperada:

    [[1, 2, 3], [1, 2], [1, 3], [1], [2, 3], [2], [3]]

    ¡Espero que eso ayude!

Comments are closed.