2011-10-27 18 views
5

Realmente no puedo encontrar esto. Traté de usar itertools, intenté todo tipo de bucles, pero aun así no puedo lograr lo que quiero. Esto es lo que necesita:Python: todas las combinaciones posibles de la lista "dinámica"

tengo lista, tales como:

list = [("car", 2), ("plane", 3), ("bike", 1)] 

Esta lista es cada vez diferente, no puede haber 5 artículos diferentes en el mismo cada vez y lo que necesito es conseguir algo como esto :

car1, plane1, bike1 
car1, plane2, bike1 
car1, plane3, bike1 
car2, plane1, bike1 
car2, plane2, bike1 
car2, plane3, bike1 

Estoy realmente perdido. Es obvio que probablemente sea algo muy simple, pero no puedo resolverlo.

Respuesta

7

usted podría utilizar itertools.product():

my_list = [("car", 2), ("plane", 3), ("bike", 1)] 
a = itertools.product(*([name + str(i + 1) for i in range(length)] 
         for name, length in my_list)) 
for x in a: 
    print x 

impresiones

('car1', 'plane1', 'bike1') 
('car1', 'plane2', 'bike1') 
('car1', 'plane3', 'bike1') 
('car2', 'plane1', 'bike1') 
('car2', 'plane2', 'bike1') 
('car2', 'plane3', 'bike1') 
+0

@SvenMarnach: ¡Gracias! ¡Esto es exactamente lo que estaba buscando! – Meph

-1

Para implementar algo como esto, la complejidad del programa sería muy alta. intentar volver a trabajar a cabo la lógica de manera que se puede reducir la complejidad ..

+0

Ok, y ¿qué pasa con el caso sin palabras? ¿Solo para generar todas las combinaciones de números de rango específico? ¿Es esto realmente tan difícil? Solo pregunto, pero creo que no debería ser tan difícil. – Meph

+0

@Anuj Mire las otras respuestas. Esto es realmente muy simple, no complejo. – agf

1

podría implementar con una función recursiva:

def combis(ls): 
    if not ls: 
     yield [] 
     return 
    (name, limit) = ls[-1] 
    for start in combis(ls[:-1]): 
     for c in range(1, limit+1): 
     yield start + [(name, c)] 
+0

No muy pitónico. – agf

2

Prueba esto:

L = [("car", 2), ("plane", 3), ("bike", 1)] 
O = [] 
N = [] 
for each in L: 
    O.append(each[0]) 
    N.append(each[1]) 
for each in O: 
    strin = "" 
    for item in N: 
    strin = strin + item + each + "," 

    print strin[:-1] 

Dado que su lista contendrá solo cinco elementos como máximo, esta es una solución plausible.

Cuestiones relacionadas