Set, list comprehensions

for i in liste1:
    ortak = [z for z in i if z in liste2]
    if len(ortak) == len(i):
        print(i)

ve

import random

liste = [random.randint(0, 10000) for i in range(1000)]

yüzden_küçük_sayılar = [i for i in liste if i < 100]
print(yüzden_küçük_sayılar)

örneklerinde;

* ortak = [z for z in i if z in liste2]

* yüzden_küçük_sayılar = [i for i in liste if i < 100]

üreteçleri anlamakta problem yok ama yapısını kavramakta zorluk çekiyorum. sözlü olarak ifade edersek birincisinde;

liste2’nin içindeki öğeleri z diye tanımlıyoruz, eğer i’nin içinde z bulunuyorsa z’yi ortak değişkenine ata. sağdan sola doğru okuduğumda gayet anlaşılır. ikinci duruma baktığımda okumak o kadarda kolay değil. [i for i<100 if i in liste] gibi bir düzenlemeye ile denedim ve tabi ki bir aceminin aldığı en çok hata olan syntax hatasını aldım. Anlamama yardımcı olabilir misiniz ?

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:

2 Beğeni