Zagnieżdżone pętle For przy użyciu funkcji rozumienia listy

85

Gdybym miał dwa ciągi 'abc'i 'def'mógłbym uzyskać wszystkie ich kombinacje, używając dwóch pętli for:

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

Chciałbym jednak móc to zrobić przy użyciu funkcji rozumienia list. Próbowałem wielu sposobów, ale nigdy mi się to nie udało. Czy ktoś wie, jak to zrobić?

John Howard
źródło

Odpowiedzi:

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

lub

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

jeśli chcesz krotki.

Podobnie jak w pytaniu, for j...to zewnętrzna pętla, for k...to wewnętrzna pętla.

Zasadniczo możesz mieć dowolną liczbę niezależnych klauzul „for x in y” w zrozumieniu listy, po prostu przyklejając jedną po drugiej.

aaronasterling
źródło
1
A co jeśli chcesz wykonać zagnieżdżoną pętlę, aby iterować po zagnieżdżonej liście? Coś takiego: [print ( 'a') do siekiery w AXS dla AXS w osi] drukuje kilka na [None, None ...] do DŁ (osi)
Pablo Ruiz Ruiz
@Pablo Myślę, że odwróciłeś pętle. L1 = [[[e1, e2, ...], ...], ...]->[ e for L2 in L1 for L3 in L2 for e in L3 ]
AnOccasionalCashew
Kolejność forinstrukcji jest taka sama, jak gdybyś zapisał ją jako dwie forpętle w dwóch oddzielnych wierszach.
Boris
aaronasterling Czy mogę używać instrukcji warunkowych w następujących miejscach?
Salik Malik
lst = [j+k if BLAHBLAHBLAH for j in s1 for k in s2]czy coś
Salik Malik
34

Ponieważ jest to zasadniczo produkt kartezjański, możesz również użyć itertools.product . Myślę, że jest to jaśniejsze, zwłaszcza gdy masz więcej iterowalnych danych wejściowych.

itertools.product('abc', 'def', 'ghi')
mile82
źródło
0

Spróbuj też rekurencji:

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))

Daje 8 kombinacji:

abc
abf
aec
aef
dbc
dbf
dec
def
Stefana Gruenwalda
źródło
W nawiązaniu do pytania OP, myślę, że wynik powinien zawierać pary liter, a kombinacji powinno być 9.
Mattia
Co się stało z: abd, abe, acd, ace, acf, adb, adc, ade, adf, aeb, aed, afb, afc, afd, afe i wszystkimi zaczynającymi się na c, e lub f? Nawet jeśli kolejność nie jest ważna, pomijane są: bda, ade itp.
Harry Binswanger
Sposób, w jaki to działa, polega na tym, że skrajna lewa pozycja może być tylko "a" lub "d", środkowa pozycja może być tylko "b" lub "e", a prawa pozycja może być tylko "c" lub "f" .
Stefan Gruenwald