Yanlış anlamışsınız. İkincide yaptığınız hata da bu yanlış anlamadan kaynaklı büyük ihtimalle.
Buradaki asıl anlaşılmayan şey üreteçlerin söz dizimi olduğu için konuyu anlaşılır yapmanın en kolay yolunun aynı işi yapacak kodu normal bir şekilde yazmak olduğunu düşünüyorum.
İlk üreteç ile başlayalım, bu kod:
liste1 = [[2, 3], [1, 3], [3, 6]]
liste2 = [1, 2, 3]
for i in liste1:
ortak = [z for z in i if z in liste2]
if len(ortak) == len(i):
print(i)
bu kod ile eşdeğer:
liste1 = [[2, 3], [1, 3], [3, 6]]
liste2 = [1, 2, 3]
for i in liste1:
ortak = []
for z in i:
if z in liste2:
ortak.append(z)
if len(ortak) == len(i):
print(i)
Şimdi asıl ilgilendiğimiz bölümleri karşılaştıralım:
ortak = [z for z in i if z in liste2]
#---------------------------------------
ortak = []
for z in i:
if z in liste2:
ortak.append(z)
Üretecin en başındaki z
, döngüdeki ortak
listesine eklenecek değişkene denk geliyor. Üretecin en başına hep listeye eklenecek ifadeyi koyuyoruz.
Sonraki for z in i
, döngüde de for z in i:
kısmına denk geliyor.
Sondaki if z in liste2
de döngüdeki if z in liste2:
kısmına denk geliyor, üreteçte soldan sağa gittikçe hizalamayı içe kaydırıyoruz gibi düşünebilirsiniz.
Bunun ile ikinci örneği karşılaştırırsak şöyle bir ayrım yapabilirsiniz diye tahmin ediyorum:
>>> liste = [1, 101]
>>> [i for i in liste if i < 100]
[1]
>>> [i for i in liste if i < 100] == [i \
... for i in liste \
... if i < 100]
True
Çünkü for döngüsünün yapısı for var in iterable: ...
şeklinde, for i < 100: ...
gibi bir kullanım yok:
>>> for i < 100:
File "<stdin>", line 1
for i < 100:
^
SyntaxError: invalid syntax
Daha fazla bilgi için: