2015-01-10 3 views
7

Sono sicuro che ci sono risposte a questa semplice domanda ma non so davvero come formularlo in inglese (vergognoso), così ho deciso di chiedere agli esseri umani.Modo pazzesco di lista singola con tutte le varianti di sottoliste

Supponiamo che io ho una lista di liste:

[['Sometimes'], [' '], ['I'], [' '], ['love', 'hate'], [' '], ['pizza', 'coke']] 

quello che sarebbe il modo più divinatorio di ottenere l'uscita?

['Sometimes I love pizza', 'Sometimes I love coke', 'Sometimes I hate pizza', 'Sometimes I hate coke'] 

risposta

10
from itertools import product 

options = [['Sometimes'],[' '],['I'],[' '],['love','hate'],[' '],['pizza','coke']] 

for combo in product(*options): 
    print("".join(combo)) 

Sometimes I love pizza 
Sometimes I love coke 
Sometimes I hate pizza 
Sometimes I hate coke 
+0

soluzione pulita. bello – ha9u63ar

+0

esattamente quello che stavo cercando, grazie! e anche, ho imparato come si chiama ora :) – c0rdis

+1

@Hugh Bothwell Si dovrebbe anche spiegare il metodo 'prodotto'. –

1

Questo può essere scritto bene con un generatore ricorsiva:

def sentences(lists, i=0, sentence=''): 
    if i == len(lists): 
     yield sentence 
    else: 
     for word in lists[i]: 
      yield from sentences(lists, i + 1, sentence + word) 

E poi

lists = [['Sometimes'],[' '],['I'],[' '],['love','hate'],[' '],['pizza','coke']] 
for s in sentences(lists): 
    print s 

che stampa

Sometimes I love pizza 
Sometimes I love coke 
Sometimes I hate pizza 
Sometimes I hate coke 

(per ottenere un elenco effettivo, list(sentences(lists)).)

+0

grazie per la vostra soluzione troppo! tuttavia, questo è meno universale di quello pubblicato sopra (funziona anche su 2.x) e più una riga :) – c0rdis

+2

@ c0rdis, sì. Ha valore come esercizio di apprendimento, ma dal momento che 'itertools' è stato incluso nelle librerie standard di Python, ha più senso utilizzarlo. –