2010-09-03 5 views
51

Se ho avuto due stringhe, 'abc' e 'def', ho potuto ottenere tutte le combinazioni di loro utilizzando due cicli for:cicli for innestati utilizzo di lista

for j in s1: 
    for k in s2: 
    print(j, k) 

Tuttavia, vorrei essere in grado di farlo usando lista di comprensione. Ho provato molti modi, ma non sono mai riuscito a ottenerlo. Qualcuno sa come fare questo?

risposta

86
lst = [j + k for j in s1 for k in s2] 

o

lst = [(j, k) for j in s1 for k in s2] 

se si desidera tuple.

Come nella domanda, for j... è il ciclo esterno, for k... è il ciclo interno.

In sostanza, è possibile avere tutte le clausole indipendenti "per x in y" che si desiderano nella comprensione di una lista semplicemente incollandole una dopo l'altra.

+0

+1 dal momento che il PO ha chiesto LC di. –

27

Poiché si tratta essenzialmente di un prodotto cartesiano, è possibile utilizzare anche itertools.product. Penso che sia più chiaro, specialmente quando hai più input iterabili.

itertools.product('abc', 'def', 'ghi') 
+0

+1 perché il prodotto è una risposta migliore di quella di LC per il fatto che itertools –

+0

colpisce ancora! Bella soluzione –

0

Prova ricorsione troppo:

s="" 
s1="abc" 
s2="def" 
def combinations(s,l): 
    if l==0: 
     print s 
    else: 
     combinations(s+s1[len(s1)-l],l-1) 
     combinations(s+s2[len(s2)-l],l-1) 

combinations(s,len(s1)) 

ti da 8 combinazioni:

abc 
abf 
aec 
aef 
dbc 
dbf 
dec 
def 
+0

Accurchiata alla domanda dell'OP, penso che l'output dovrebbe dare coppie di lettere e ci dovrebbero essere 9 combinazioni. – Mattia

+0

Cosa è successo a: abd, abe, acd, ace, acf, adb, adc, ade, adf, aeb, aed, afb, afc, afd, afe, e tutti quelli che iniziano con c, e, o f? Anche se l'ordine non è importante, omessi sono: bda, ade, ecc. –

+0

Il modo in cui funziona è che la posizione più a sinistra può essere solo "a" o "d", la posizione centrale può essere solo "b" o " e ", e la posizione corretta può essere solo" c "o" f ". –