List Comprehensions Hk

Selamlar değerli arkadaşlar. Python dökümanlarında XOX oyunu yapımını anlatan konudayım liste üreteçleri işte. Daha önce bununla alakalı konu açılmış ama 1 yıl geçmiş üstünden bu yüzden hortlatmak istemedim konuyu.
Ben oradaki liste ve döngü mantığını anlamak için listeyi biraz daha kısalttım. Fakat anlamakta güçlük çektiğim bazı noktalar var. Bunu kendimce satır satır anlatmak istiyorum ve anlamadığım kısmı siz üstatlar sayesinde bu şekilde bulabileceğimi düşünüyorum.
Mesela ;
listem1 = [[1,2,3], [4,5,6], [7,8,9], [10,11,12]]
ikinciListem = [1,2,3,4,7,9,10,50,55,60,65,70,75,80,85,90,96,99,98,88,77]

for i in listem1:
ortak = []
for z in i:
    if z in ikinciListem:
        ortak += [z]
        if len(ortak) == len(i):
            print(i)
  1. Satır - ‘listem1’ adlı dizi içinde i adını verdiğim her öğe için…
  2. " " - ortak adlı boş bir dizi verisi oluşturdum.
  3. " " - i adlı dizi içinde z adını verdiğim her öğe için…;
  4. " " - Eğer z ikinciListem adlı dizide varsa;
  5. " " - z’yi ortak adlı boş dizeye gönder/ekle.
  6. " " - eğer ortak dizisinin toplam karakter sayısı i dizisinin toplam karakter sayısıyla eşleşiyorsa;
  7. " " - i’yi ekrana yazdır.

Abiler 6. satır mesela ; i dizisinin toplam karakter sayısıyla eşleşiyorsa? Yani i nasıl 3 karakteri içinde tutabiliyor?
Döngüler şöyle değil miydi? Diyelim ki ben oluşturduğum bir karakter dizisinin bütün harflerini tek tek ekrana yazdırmak istiyorum ;

karakter  = "asdasdas"
for i in karakter:
print(i)

Yukaridaki döngü bütün karkaterleri tek tek yazdırırken, dizilerde i nin toplam karakter uzunluğu yani len(i) nasıl oluyorda ortak dizisiyle eşit olabiliyor? tek tek dolaşmıyor mu? :S
Vallahi sanırım anlatmak istediğimide çok karıştırdım ama umarım anlatabilmişimdir. Özür dilerim bu karmaşık anlatım için.
Bu konuyu es geçebilirdim bakarken ama anlamadıktan sonra es geçsem ne yazar diye dün gece bıraktım eğitimi, dedim önce bunu anla sonra ilerle :smiley:

Neredeki, hangi listeyi?

Ortalikta karakter yok, karakter sayisi da yok. Listeler eleman olarak sayi tutuyorlar. Icinde 3 adet sayi tutan 4 tane liste var, isimsizler.

i bir sey tutmuyor, sirayla listem1’in butun 4 elemaninin degerini aliyor (onceki cumlede bahsettigim isimsiz listeler.)

i’nin uzunlugu dort defada da 3. ortak listesinin de uzunlugu 3 oldugunda tesadufen esit oluyorlar.


Yazdigin kodu daha iyi anlayabilmen icin yazdigin kodun kendisini daha iyi anlatmasi lazim. i bir indisi veya tamsayiyi temsil etmedigi icin yanlis isim. z’nin bir anlami yok. Listeler… tamam, test kodu olduklari icin liste olmaktan baska bir amaclari olmayabilir ama neden farkli sekillerde isimlendirilmisler?

1 Beğeni

( Liste Üreteçleri (List Comprehensions) )
Burada bahsedilen liste1 ve liste2 den bahsediyorum

Bende bunu demek istemiştimde gereksiz bir alışkanlık olmuş (karakter diye yazmak) .

Tamam işte hocam karışan yer tam olarak burası.
Yukarıda i’nin uzunluğu nasıl oluyorda eşit oluyor ortak ile dememdeki kasıt benim tamamen yanlış düşüncemden kaynaklı.
Ben olayı şöyle sanıyordum ; (ki niye sonradan denemedim anlamadım)

liste1 = [[1,2,3], [3,4,5], [6,7,8]]
for i in liste1:
print(i)

Ben bu döngüde i’nin bütün elemanları (iç elemanlar) gezeceğini zannediyordum. Yani şöyle bir çıktı bekliyorum
1, 2, 3, 4, 5, 6, 7, 8 gibi. Ama haliyle yukarıdaki gibi iç içe liste olunca o zaman [1,2,3] [4,5,6]… diye iç listenin tamamını veriyor. Yani i’nin uzunluğu bu yüzden 3 oluyor.

Hocam Yazbel python dökümanlarında bu şekilde, bende oraya göre gitmek istedim. Tabi bu bir bahane değil ama bundan sonra daha dikkat edeceğim kesin. Hocam siz bu döngüyü nasıl oluştururdunuz peki ? (isim olarak soruyorum)

Tahmin ettim de, link olmayinca bakamadim :slight_smile:

Belli bir amaca hitap etmeden kodu isimlendirmek zor, ama deneyeyim:

for ic_liste in dis_liste:
  for ic_eleman in ic_liste:
    ...

Veya en kotu, ic elemana z dediysek dis eleman zs veya zler:

for zs in liste1:
  for z in zs:
    ...

i indis veya (tam)sayilar icin kullaniliyor. Liste elemanlari icin muadili e veya x. Tabi listenin ismi duzgunse tekil hali kullanilabilir:

for coordinate in coordinates:
  ...

Listenin ne oldugu hakikaten belli degilse (butun listelerle calisan bir fonksiyon yaziyorsak mesela) Haskell konvansiyonu olarak xxsxss kullaniyorum.

>>> flatten = lambda xss: [x for xs in xss for x in xs]
>>> flatten([[1,2],[3,4],[5]])
[1, 2, 3, 4, 5]

Bu arada isimlendirmeyle ilgili soylediklerimi geri aliyorum. Bir kodun yaninda/etrafinda calisiyorsak hali hazirda o kodun kullandigi isimleri kullanmak (kotulerse bile) dogrusu.

2 Beğeni

Teşekkür ederim @aib hocam her şey için :slight_smile: Işte zamanla pişeceğiz :smiley: