Liste Anlamayı Kullanarak Döngüler İçin Yuvalanmış


88

İki dizem olsaydı 'abc've 'def'bunların tüm kombinasyonlarını iki döngü için kullanarak elde edebilirdim:

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

Ancak, bunu liste anlama kullanarak yapabilmek isterim. Pek çok yol denedim ama asla elde edemedim. Bunun nasıl yapılacağını bilen var mı?

Yanıtlar:


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

veya

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

tuples istiyorsanız.

Soruda for j...olduğu gibi, dış döngü, for k...iç döngüdür.

Esasen, sadece birbiri ardına yapıştırarak, bir liste anlayışında istediğiniz kadar bağımsız 'for x in y' cümleciklerine sahip olabilirsiniz.


1
İç içe geçmiş bir listeyi yinelemek için iç içe geçmiş döngü yapmak isterseniz ne olur? Şuna benzer bir şey: [eksenlerdeki baltalar için eksenlerdeki balta için ('a') yazdırın], [Yok, Yok ...] en fazla uzunluk (eksenler) üzerine bir grup yazdırıyor
Pablo Ruiz Ruiz

@Pablo Bence döngülerin tersine döndü. L1 = [[[e1, e2, ...], ...], ...]->[ e for L2 in L1 for L3 in L2 for e in L3 ]
AnOccasionalCashew

forİfadelerin sırası, onu foriki ayrı satırda iki döngü halinde yazmışsınız gibi aynıdır .
Boris

aaronasterling Aşağıdaki durumlarda koşullu ifadeler kullanabilir miyim?
Salik Malik

lst = [j+k if BLAHBLAHBLAH for j in s1 for k in s2]ya da bir şey
Salik Malik

35

Bu aslında bir Kartezyen ürün olduğu için itertools.product'u da kullanabilirsiniz . Bence daha net, özellikle daha fazla yinelenen girdiniz olduğunda.

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

0

Özyinelemeyi de deneyin:

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

Size 8 kombinasyon verir:

abc
abf
aec
aef
dbc
dbf
dec
def

OP'nin sorusuna göre, çıktının harf çiftleri vermesi gerektiğini ve 9 kombinasyon olması gerektiğini düşünüyorum.
Mattia

Ne oldu: abd, abe, acd, ace, acf, adb, adc, ade, adf, aeb, aed, afb, afc, afd, afe ve c, e veya f ile başlayanlar? Sırası önemli olmasa bile, ihmal şunlardır: vb bda, ade,
Harry Alper Hasanoğlu

Bunun çalışma şekli, en soldaki konum yalnızca "a" veya "d" olabilir, orta konum yalnızca "b" veya "e" olabilir ve sağ konum yalnızca "c" veya "f" olabilir. .
Stefan Gruenwald
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.