Python - Combinaciones sin repeticion de lista

   
Vista:

Combinaciones sin repeticion de lista

Publicado por epicteto (43 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

Combinaciones sin repeticion de lista

Publicado por xve (1229 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

Combinaciones sin repeticion de lista

Publicado por epicteto (43 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
0
Comentar

Combinaciones sin repeticion de lista

Publicado por epicteto (43 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 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 pecholov@gmail.com (1 intervención) 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 dmattosr@gmail.com (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