Python - Combinaciones sin repeticion de lista

 
Vista:
sin imagen de perfil
Val: 3
Ha disminuido su posición en 22 puestos en Python (en relación al último mes)
Gráfica de Python

Combinaciones sin repeticion de lista

Publicado por epicteto (46 intervenciones) el 23/07/2014 17:30:38
Hola

Supongamos una lista lista=[a,b,c,d,e]

Estoy intentando hacer un script que me haga todas las combinaciones sin repetición posibles de n elementos con los de la lista. En este caso combinaciones de un elemento, dos, tres, cuatro y cinco, tantos como número de elementos halla.

En el caso de dos elementos el resultado sería, dado que son sin repetición: ab,ac,ad,ae,bc,bd,be,cd,ce,de.

Lo estoy intentando con listas de compresión, pero no termina de salirme

Gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de xve
Val: 2.239
Plata
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Combinaciones sin repeticion de lista

Publicado por xve (1646 intervenciones) el 23/07/2014 18:34:13
Hola Epicteto, no se si te he entendido bien... pero creo que con un bucle dentro de otro bucle...

Prueba este código haber si te sirve...

1
2
3
4
5
lista=["a","b","c","d","e"]
 
for i in lista:
	for j in lista:
		print i,j

Coméntanos, ok?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 3
Ha disminuido su posición en 22 puestos en Python (en relación al último mes)
Gráfica de Python

Combinaciones sin repeticion de lista

Publicado por epicteto (46 intervenciones) el 23/07/2014 18:57:02
Gracias por la respuesta

El código que me envías lo que hace son las combinaciones de los elementos de la lista tomados sólo de dos en dos (yo necesito de uno en uno, de dos en dos, de tres en tres... tantas como elementos haya, en este caso hasta 5), y además diferencia entre por ejemplo "ae" y "ea", si hace uno ya no debe hacer el otro (son combinaciones sin repetición)

Con este código lo he conseguido:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
lista = ('a', 'b', 'c', 'd', 'e')
 
combinaciones=[]
 
for i in range(len(lista)):
    combinaciones.append([])
 
 
for a in range(len(lista)):
    combinaciones[0].append(lista[a])
    for b in range(a+1,len(lista)):
        combinaciones[1].append(lista[a] + lista[b])
        for c in range(b+1,len(lista)):
            combinaciones[2].append(lista[a] + lista[b] + lista[c])
            for d in range(c+1,len(lista)):
                combinaciones[3].append(lista[a] + lista[b]+ lista[c]+ lista[d])
                for e in range(d+1,len(lista)):
                    combinaciones[4].append(lista[a] + lista[b]+ lista[c]+ lista[d]+ lista[e])
 
print combinaciones

pero me gustaría mejorarlo en dos aspectos. En primer lugar que fuera flexible y el número de bucles se adaptara al número de elementos de la lista sin que yo tenga que hacer tantos bucles como elementos haya, y por otro lado, y esto ya es más "caprichoso", estoy seguro que al mismo tiempo se puede hacer más elegante, con una lista anidada o algo similar... ¡¡pero no me sale !!!

En cualquier caso gracias por tu ayuda
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Bitu

Combinaciones sin repeticion de lista

Publicado por Bitu (8 intervenciones) el 25/07/2014 18:09:17
Espero Te sirva...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/usr/bin/env python
#-*-coding:utf-8-*-
 
def combinacion(combinar, lista):
	"""
	Esta funcion combina los elementos de la lista "combinar" con los elementos de la lista
	"Lista"; toma cada elemento de combinar y le adjunta un elemento respectivo de "lista" a menos
	de que el elemento de "Lista" este repetido en el elemento de "combinar" o este en posicion detras del
	ultimo caracter del elemento "combinar"

	PARAMETROS:
		Dos listas
	RETORNO:
		Una lista con la combinacion unica de "combinar" y "lista" sin repetir elementos.
	"""
	new_comb=[]
	for x in combinar:
		pto=lista.index(x[len(x)-1]) #Hace que el nuevo elemento agregado de "Lista", sea el siguiente en posicion del ultimo caracter del elemento "combinar"
		for j in range(pto,len(lista)):	# para cada elemento de 'lista' desde el elemento "lista" que hace parte del ultimo caracter del elemento de "combinar" hasta el ultimo elemento de'lista'
			if lista[j] not in x and lista[len(lista)-1] not in x:	#Si el elemento de "lista" no esta en el elemento "combinar" y ademas el elemento "lista" no es el ultimo caracter del elemento "combinar"
				new_comb.append(x+lista[j]) #Agrega a una nueva lista la combinacion
	print new_comb
	print "+++++++++++++++++++++++++++++++++++++++++++++++++"
 
	return new_comb #Esta nueva lista se utilizara como parametro al llamar de nuevo la funcion... 
 
 
 
 
lista=["a","b","c","d","e"]
print "COMBINACIONES"
print "++++++++++++++"
combinacion(combinacion(combinacion(combinacion(lista, lista),lista),lista),lista) #Llamo la funcion asi misma y me permite organizar una nueva lista cada vez y usarla como parametro (este es el truco!)

Si hay algun problema, o no entiendes mi documentacion aunque trate de hacerlo con el mayor detalle... escribeme y con gusto te ayudare en lo que pueda
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Bitu

Combinaciones sin repeticion de lista

Publicado por Bitu (8 intervenciones) el 25/07/2014 18:28:34
Mira... una actualizacion para que no tengas que llamar manualmente la funcion.....
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#!/usr/bin/env python
#-*-coding:utf-8-*-
 
def combinacion(combinar, lista):
	"""
	Esta funcion combina los elementos de la lista "combinar" con los elementos de la lista
	"Lista"; toma cada elemento de combinar y le adjunta un elemento respectivo de "lista" a menos
	de que el elemento de "Lista" este repetido en el elemento de "combinar" o este en posicion detras del
	ultimo caracter del elemento "combinar"

	PARAMETROS:
		Dos listas
	RETORNO:
		Una lista con la combinacion unica de "combinar" y "lista" sin repetir elementos.
	"""
	new_comb=[]
 
	for x in combinar:
		pto=lista.index(x[len(x)-1]) #Hace que el nuevo elemento agregado de "Lista", sea el siguiente en posicion del ultimo caracter del elemento "combinar"
		for j in range(pto,len(lista)):	# para cada elemento de 'lista' desde el elemento "lista" que hace parte del ultimo caracter del elemento de "combinar" hasta el ultimo elemento de'lista'
			if lista[j] not in x and lista[len(lista)-1] not in x:	#Si el elemento de "lista" no esta en el elemento "combinar" y ademas el elemento "lista" no es el ultimo caracter del elemento "combinar"
				new_comb.append(x+lista[j]) #Agrega a una nueva lista la combinacion
 
	print new_comb
	print "+++++++++++++++++++++++++++++++++++++++++++++++++"
 
	return new_comb #Esta nueva lista se utilizara como parametro al llamar de nuevo la funcion... 
 
 
 
 
lista=["a","b","c","d","e","f","g"]
comb_final=lista
print "COMBINACIONES"
print "++++++++++++++"
 
while len(comb_final)>1:	#Un bucle que llama la funcion hasta que esten todas las combinaciones posibles
	comb_final=combinacion(comb_final,lista)

La ventaja es que funciona con listas mas grandes si quieres.... saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 3
Ha disminuido su posición en 22 puestos en Python (en relación al último mes)
Gráfica de Python

Combinaciones sin repeticion de lista

Publicado por epicteto (46 intervenciones) el 02/08/2014 19:05:49
Lo entiendo perfectamente

Gracias !!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Combinaciones sin repeticion de lista

Publicado por Karen Galarza (1 intervención) el 12/07/2017 04:05:48
No me sale no me imprime NADA.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Combinaciones sin repeticion de lista

Publicado por ruben stark (1 intervención) el 02/01/2016 05:52:47
Disculpa intento cambiar las variables pero me sale error
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de antonio

Combinaciones sin repeticion de lista

Publicado por antonio (2 intervenciones) el 21/03/2016 19:48:19
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# -*- coding: utf8 -*-
#! python
import itertools
 
A= input ("Nombre del que quieres sacar las posibles combinaciones: "
          + "Cuidado con poner muchas letras pueden salir demasiadas."
          + " Realmente salen tantas como el FACTORIAL del número de letras")
B= input("Longitud de las permutaciones: " +
         "El mismo consejo no poner un número muy alto")
 
ele= A
lon= int(B)
 
TOTAL=[]
 
C= itertools.permutations(ele, lon)
for i in C:
    D= "".join(i)
    TOTAL.append(D)
 
print(TOTAL)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Combinaciones sin repeticion de lista

Publicado por daniel (1 intervención) el 09/07/2016 20:03:01
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# -*- coding: utf8 -*-
#! python
import itertools
palabras = ['password', 'admin', '2015', '2016', 'qwerty']
list_password = []
 
# formara lista juntanto 2 palabras, 3 palabras
for r in [2,3]:
    # para permutar cambiar combinations por permutations
    res = itertools.combinations(palabras, r)
    for e in res:
        list_password.append(''.join(e))
print list_password
# resultado:
'''
['passwordadmin', 'password2015', 'password2016', 'passwordqwerty', 'admin2015', 'admin2016', 'adminqwerty', '20152016', '2015qwerty', '2016qwerty', 'passwordadmin2015', 'passwordadmin2016', 'passwordadminqwerty', 'password20152016', 'password2015qwerty', 'password2016qwerty', 'admin20152016', 'admin2015qwerty', 'admin2016qwerty', '20152016qwerty']
'''
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Combinaciones sin repeticion de lista

Publicado por oskar (1 intervención) el 07/03/2018 19:54:33
como hago para combinar palabras de dos archivos .txt diferentes es decir tengo:

path primer archivo con su contenido
amor
paz
respeto
solidaridad

path segundo archivo con su contenido
logra
dedica
regala
promueve

quiero juntar esas dos lineas de esos dos archivos diferentes con sus permutaciones
para que me salga un ,txt final con

logra paz
dedidca respeto
regala amor
etc...

seria en python 2.7 por cierto tu script anterior lo ejecute y me da error me sale can't find '__main__' module in ''
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Combinaciones sin repeticion de lista

Publicado por ANTONIO S GEMA DOBLAS LUNA (2 intervenciones) el 10/03/2018 01:17:31
Si logras que te funcione con una palabra... ya lo tienes. En vez de permutar las letras, une los dos ficheros txt en uno solo... luego aplicale las permutaciones al conjunto de palabras... ¿cómo?... se me ocurren varias maneras, pero en el fondo es lo mismo permutar una lista de palabras que una lista de letras que de numeros... no se si me explico... pero antes consigue que funcione la permutación en sí misma.... el resto es repetir el mismo proceso...o eso creo... no lo he intentado...
En cuanto al error ese , no necesitas un _main_ ... es un simple script, eso si dale permiso para que se ejecute con pithon... no como modulo sino como una aplicación... creo que no necesitas un _main_.... Luego con algo de control sobre formateo de cadenas añades los espacios o renglones necesarios, porque te junta las palabras, quizás debas incluir los espacios en las cadenas iniciales. Si es el 2.7.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar