Liste Üreteçleri (List Comprehension) anlayamadım

liste = [[1, 2, 3],
         [4, 5, 6],
         [7, 8, 9],
         [10, 11, 12]]

tümü = [z for i in liste for z in i]
print(tümü)

Şu olayı bir türlü anlayamadım. Bu kodu okumaya nereden başlıyoruz, sağdan sola mı, soldan sağ mı okuyoruz… Mantığını bir türlü oturtamadım yardımcı olur musunuz? Adım adım anlatabilecekseniz gerçekten çok mutlu olurum.

Öncelikle burada iç içe 2 liste üreteci var. Anlamanız için kodun for ile yazılan halini versem yeterli olur mu?:

liste = [[1, 2, 3],
         [4, 5, 6],
         [7, 8, 9],
         [10, 11, 12]]

tümü = []
for i in liste:
    for z in i:
        tümü.append(z)

print(tümü)
1 Beğeni

Bu kodu rahatlıkla anlayabiliyorum ama diğer kodu bir türlü anlayamıyorum.

tümü = [>>z<< for i in liste for z in i]
Bu kısım tümü.append(z) gibi davranıyor.

tümü = [z >>for i in liste<< for z in i]
Bu kısım ilk for döngüsü.

tümü = [z for i in liste >>for z in i<<]
Bu kısım ise ikinci for döngüsü.

Yani tümü.append(z) yerine geçen z en başa, diğerleri yukarıdan aşağı yazıldığı sırayla yazılıyor.

1 Beğeni

şuradan yürüttüm: https://stackoverflow.com/a/45079294

Bu listelerden oluşan bir listeyi “düzlemek” için kullanılan kalıplardan bir tanesi. 2’den fazla for ile list-comprehension çok okunabilir olmayacağı gibi büyük ihtimalle itertools.product ve benzeri ile sadeleştirilebilir. Hatta 2 tane for ile olan da çok okunabilir sayılmaz. Belki şöyle yazılabilir ama

duz = [eleman
       for alt_liste in liste
       for eleman in alt_liste]

Aslında tek bir liste üreteci var zira tek bir liste üretiliyor :ğ iki tane olan for

1 Beğeni

İnglizce’si “Nested List Comprehension” diye öyle dedim.


Bir de, “:ğ” tam olarak ne ifade ediyor?

yok bu farklı: https://docs.python.org/3/tutorial/datastructures.html?#nested-list-comprehensions

[[row[i] for row in matrix] for i in range(4)]

üslubu yumuşatsın diye

Ben bu kullanımı([z for i in liste for z in i]) şurada görmüştüm:


Tamam :slight_smile:, anlamını tam çıkaramamıştım.

O site genel olarak pek iyi bir site değil bana sorarsanız ve 2.örnekte terimi yanlış kullanmışlar.

2 Beğeni

Olabilir, peki bu tür liste üreteçlerinin bildiğiniz bir adı var mı?

Bir liste nested değilse flat'dir. nested = iç içe, flat = düz. Yani tek boyutlu listeler flat listelerdir. 2 veya daha fazla boyutu olan listeler nested list olur.

# flat list
[i * j for i in range(10) for j in range(10)]
# nested list
[[i * j for i in range(10)] for j in range(10)]
1 Beğeni

Mantıklı, ama bence daha açık olması için bunlara “Çoklu Liste Üreteçleri” diyebiliriz.

Flat List Comprehensions:

[x for x in y]

Nested List Comprehensions:

[[x for x in y] for y in z]

Multiple List Comprehensions:

[x for y in z for x in y]
1 Beğeni

İsterseniz kendinize göre yeni isimler üretin ama mevcut bir terminoloji var, bana göre oldukça da açık. Sizin multiple list comprension dediğiniz iterasyon sayısını artırmak sadece.

Yani demek istediğim “flat” kelimesi her ikisinide kapsıyor daha ayırıcı olması açısında böyle bir isim önerdim.

Maalesef flat kelimesi ikisini de kapsamıyor. Aşağıdaki örnekleri inceleyin lütfen:

# flat + multiple
[i for i in range(10) for j in range(10)]
# nested + multiple
[[i for i in range(10)] for j in range(10) for k in range(10)]

Kusura bakmayın, ben “her ikisinide” derken bildiğimiz basit liste üreteçleri ile içerisinde birden fazla döngü bulunduran liste üreteçlerini kast etmiştim.

1 Beğeni

Estağfurullah ne kusuru. <3

1 Beğeni

“Liste üreteçleri” dilin kendisinin de dediği üzere. Diğeri de “İç içe liste üreteçleri” yine dilin tanımladığı şekilde. Yani 2 kısma ayırmışlar. Dolayısıyla sayın PRIME’ın sorduğuna direkt “liste üreteci” diyoruz.

2 Beğeni