2015-01-10 17 views
7

Ich bin sicher, dass es Antworten auf diese einfache Frage gibt, aber ich weiß nicht wirklich, wie man es auf Englisch formulieren soll (beschämt), also beschloss ich, Menschen zu fragen.Pythonischer Weg der einzelnen Liste mit allen Variationen der Unterlisten

Angenommen, ich habe eine Liste von Listen:

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

Was wäre die pythonic Weise die folgende Ausgabe zu erhalten?

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

Antwort

10
from itertools import product 

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

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

gibt

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

saubere Lösung. schön – ha9u63ar

+0

genau das, was ich gesucht habe, danke! und auch, ich habe gelernt, wie es jetzt heißt :) – c0rdis

+1

@Hugh Bothwell Sie sollten die 'Produkt' Methode auch erklären. –

1

Dieses mit einem rekursiven Generator schön geschrieben werden kann:

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) 

Und dann

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

die druckt

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

Auch

(Um eine aktuelle Liste zu erhalten, list(sentences(lists)).)

+0

Sie für Ihre Lösung danken! jedoch ist diese eine weniger universell als oben gepostet (funktioniert auch auf 2.x) und mehr einzeilige :) – c0rdis

+2

@ c0rdis, ja. Es hat einen Wert als Lernübung, aber da 'itertools' in den Python-Standardbibliotheken enthalten ist, ist es am sinnvollsten, dies zu verwenden. –

Verwandte Themen