2011-10-27 30 views
5

Non riesco proprio a scoprirlo. Ho provato ad usare itertools, ho provato tutti i tipi di looping, ma ancora non riesco a ottenere quello che voglio. Ecco quello che ho bisogno:Python: tutte le possibili combinazioni dell'elenco "dinamico"

devo lista come ad esempio:

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

Questa lista è ogni volta diverso, non ci può essere di 5 diversi elementi in esso ogni volta e che cosa ho bisogno è di ottenere qualcosa di simile :

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

Sono davvero perso. È ovvio che probabilmente sarà qualcosa di molto semplice, ma non sono in grado di risolverlo.

risposta

7

si potrebbe usare 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 

stampe

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

@SvenMarnach: Grazie! Questo e 'esattamente quello che stavo cercando! – Meph

-1

Per implementare qualcosa di simile, la complessità del programma sarebbe molto alta. provare rielaborazione la logica in modo da poter ridurre la complessità ..

+0

Ok, e per quanto riguarda il caso senza parole? Solo per generare tutte le combinazioni di numeri di intervallo specifico? E 'davvero così difficile? Sto solo chiedendo, ma io non dovrebbe essere così difficile. – Meph

+0

@Anuj Si prega di guardare le altre risposte. Questo è in realtà _molto semplice_, non complesso. – agf

1

è possibile implementare con una funzione ricorsiva:

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

Non molto Pythonic. – agf

2

Prova questo:

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] 

Poiché l'elenco conterrà solo cinque elementi al massimo, questa è una soluzione plausibile.

Problemi correlati