Cicli For annidati utilizzando la comprensione della lista


88

Se avessi due stringhe 'abc'e 'def', potrei ottenere tutte le combinazioni di esse usando due cicli for:

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

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

Risposte:


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

o

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

se vuoi le tuple.

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

In sostanza, puoi avere tutte le clausole 'for x in y' indipendenti che desideri in una comprensione di lista semplicemente incollandole una dopo l'altra.


1
Cosa succede se si desidera eseguire il ciclo nidificato per iterare su un elenco nidificato? Qualcosa del tipo: [print ('a') for axs in axs for axs in axes] sta stampando un mazzo su [Nessuno, Nessuno ...] fino a len (assi)
Pablo Ruiz Ruiz

@Pablo penso che tu abbia invertito i tuoi loop. L1 = [[[e1, e2, ...], ...], ...]->[ e for L2 in L1 for L3 in L2 for e in L3 ]
AnOccasionalCashew

L'ordine delle foristruzioni è lo stesso come se lo avessi scritto come due forcicli su due righe separate.
Boris

aaronasterling Posso usare le istruzioni condizionali nel seguente?
Salik Malik

lst = [j+k if BLAHBLAHBLAH for j in s1 for k in s2]o qualcosa del genere
Salik Malik

35

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

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

0

Prova anche la ricorsione:

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 dà le 8 combinazioni:

abc
abf
aec
aef
dbc
dbf
dec
def

In base alla domanda di OP, penso che l'output dovrebbe fornire coppie di lettere e dovrebbero esserci 9 combinazioni.
Mattia

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, vengono omessi: bda, ade, ecc.
Harry Binswanger

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 destra può essere solo "c" o "f" .
Stefan Gruenwald
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.