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.
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 aCombinationList
. Para solucionar esto, puedes crear una copia de la lista antes de agregarla aCombinationList
, 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 índicei
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:
Esto debería darte la salida esperada:
[[1, 2, 3], [1, 2], [1, 3], [1], [2, 3], [2], [3]]
¡Espero que eso ayude!