2015-01-10 15 views
7

Bu basit sorunun cevabını aldığımdan eminim ancak İngilizce'yi nasıl uyandırdığını gerçekten bilmiyorum (utanıyorum), bu yüzden insanlara sormaya karar verdim.Alt listelerin tüm varyasyonları ile tek bir listenin pythonik yolu

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

Ne aşağıdaki çıktıyı elde etmek en pythonic yolu olacaktır:

varsayalım Ben listelerin listesi var?

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

cevap

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

temiz bir çözüm. güzel – ha9u63ar

+0

tam olarak aradığım şey, teşekkür ederim! ve ayrıca, şimdi nasıl çağrıldığını öğrendim :) – c0rdis

+1

@Hugh Bothwell Ayrıca 'product' yöntemini de açıklamanız gerekir. –

1

Bu özyinelemeli jeneratör ile güzel yazılabilir:

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) 

Sonra

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

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

yazdırır

(gerçek liste, list(sentences(lists)) almak için.)

+0

de senin çözümü için teşekkür ederim verir! Ancak, bu yukarıda yayınlanan (daha 2.x üzerinde çalışır) ve daha fazla tek satırlık – c0rdis

+2

@ c0rdis, evet daha az evrenseldir. Bir öğrenme alıştırması olarak değeri vardır, ancak itertools'un Python standart kütüphanelerinde yer almasından dolayı, bunu kullanmak çok mantıklıdır. –

İlgili konular