Bu makalede python’da daha kısa ve daha hızlı kod yazmamıza imkan veren List Comprehension konusundan bahsedeceğiz.
Python’da list comprehension, bir liste oluşturmak için kullanılan kısa ve okunaklı bir yöntemdir. List comprehension, for döngüsüne benzer bir sözdizimine sahiptir, ancak daha kısa ve daha hızlıdır.
Örneğin, bir sayı dizisinden yalnızca çift sayıları seçmek istediğinizi varsayalım.
Bunun için önce List Comprehension kullanmadan yazalım sonra list comprehension yapısını kullanarak aradaki farkı iyice anlayalım.
sayilarim = [1, 2, 3, 4, 5, 6, 7, 8] ciftSayilar = [] for sayi in sayilarim: if sayi % 2 == 0: ciftSayilar.append(sayi) print(ciftSayilar)
Bu kod, sayilarim listesindeki çift sayıları seçer ve ciftSayilar listesine ekler. Şimdi bu kod bloğunu list comprehension ile yazalım
sayilarim=[1,2,3,4,5,6,7,8] ciftSayilar=[i for i in sayilarim if i%2==0] print(ciftSayilar)
Burada, sayilarim adlı bir liste tanımlıyoruz ve ardından ciftSayilar adlı yeni bir liste oluşturuyoruz. Yeni liste, sayilarim listesindeki tüm çift sayıları içerir. Kodun çıktısı şu şekilde olacaktır:
Bu kodda, [i for i in sayilarim if i % 2 == 0] ifadesi list comprehension’ı temsil eder. Burada, i değişkeni sayilarim listesindeki her bir öğeyi temsil eder ve if i % 2 == 0 koşulu sadece çift sayıların seçilmesini sağlar.
Yani, list comprehension yapısında önce for döngüsü, ardından bir veya daha fazla if ifadesi yer alır. Yani, [expression for variable in iterable if condition] şeklinde bir yapısı vardır. Bu, expression değişkenini iterable içindeki her bir variable değeri için değerlendirir ve sadece condition ifadesi doğru olduğunda yeni bir öğe oluşturur
List comprehension yapısında, if ifadesi for döngüsünden önce veya sonra yer alabilir. Yani, [expression if condition else expression2 for variable in iterable] şeklinde bir yapı da kullanılabilir. Bu, condition ifadesi doğruysa expression ifadesi değerlendirilir ve yeni bir öğe oluşturulur, aksi takdirde expression2 ifadesi değerlendirilir ve yeni bir öğe oluşturulur.
listem=[1,2,3,4,5,6] yeni_listem=[i if i%2==0 else i**3 for i in listem] print(yeni_listem)
Bu kodda, [i if i % 2 == 0 else i**3 for i in listem] ifadesi list comprehension’ını temsil eder. Burada, i değişkeni listem listesindeki her bir öğeyi temsil eder. İf-else ifadesi, i değeri çift ise i ifadesini, tek ise i**3 ifadesinin değerlendirilmesini sağlar.
Kodun çıktısı şu şekilde olacaktır:
Bu örnekte, if-else
ifadesi for
döngüsünden önce yer alır. Yani, expression if condition
şeklinde bir yapı,
else expression2variable in iterable
ifadesinden önce kullanılabilir.
İleri Düzeyde Bir Algoritma Sorusu
Şimdi ileri bir algoritma sorusu ile konumuzu pekiştirelim.
Örneğimiz, list Comprehension yapısı kullanarak bir metin içerisinde en fazla tekrar eden kelimeyi bulalım.
metin="""Merhaba ben ibrahim python hakkında yazıyorum. python esnektir, python kullanılışlıdır""" kelimeSayisi={kelime:metin.split().count(kelime) for kelime in set(metin.split())} print(kelimeSayisi) tekrarEdeniBul=max(kelimeSayisi, key=kelimeSayisi.get) print(f"En sık tekrar eden kelime: {tekrarEdeniBul}")
Bu kodda, metin değişkeni içindeki kelimeleri bulmak için split() metodunu kullandık ve set() fonksiyonu ile tekrar eden kelimeleri çıkardık. Daha sonra, for döngüsü ile her kelimeyi ele aldık ve sözlük yapısına dahil ettik. Her kelimenin sayısını count() metodunu kullanarak hesapladık.
En sık tekrar eden kelimeyi bulmak için max() fonksiyonunu kullanarak kelimeSayisi sözlüğündeki en yüksek sayıya sahip kelimeyi seçtik. Son olarak, bu kelimeyi ekrana yazdırdık.
Kodun çıktısı şu şekilde olacaktır:
Özetle bu örnekte, bir metindeki en sık tekrar eden kelimeyi list comprehension yapısı kullanarak bulduk. for
döngüsü kullanarak her kelimeyi ele alarak sözlük yapısına dahil ettik ve max()
fonksiyonu ile en sık tekrar eden kelimeyi bulduk.
Bu örnek, bir metindeki en sık tekrar eden kelimeyi bulmak için list comprehension’ın ne kadar kullanışlı olabileceğini göstermektedir.
List Comprehension ile ilgili örnekler
1. Basit Düzeyde Bir Örnek
Verilen bir metin içindeki tüm harfleri büyük harfe dönüştürme
metin="merhaba ibrahim" buyukMetin=" ".join([kelime.upper() for kelime in metin.split()]) print(buyukMetin)
Kodun çıktısı aşağıdaki gibidir.
Bu örnekte, metin adlı string içindeki tüm harfleri büyük harfe dönüştürmek için list comprehension yapısını kullanıyoruz. İfade içinde, her bir harf için upper() fonksiyonu kullanılır ve ardından join() fonksiyonu kullanılarak harfler tekrar birleştirilir.
2. Orta Düzeyde Bir Örnek
Verilen bir liste içindeki her elemanın uzunluğunun 5’ten büyük olup olmadığını kontrol etme ve 5’ten büyük olanları başka bir liste içinde saklama
meyveler=["Elma","Karpuz","Portakal","Çilek","Muz","Erik"] uzunKelimeler=" ".join([meyve for meyve in meyveler if len(meyve)>5]) print(uzunKelimeler)
Kodun çıktısı şu şekilde olacaktır:
Bu örnekte, meyveler adlı listedeki her bir elemanın uzunluğunun 5’ten büyük olup olmadığını kontrol etmek için list comprehension yapısını kullanıyoruz. if koşuluyla her bir elemanın uzunluğu kontrol edilir ve uzunluğu 5’ten büyük olan elemanlar uzunKelimeler adlı yeni bir listede saklanır.
3. İleri Düzeyde Bir Örnek
Verilen bir metin belgesinde en çok tekrar eden kelimeyi bulma
with open("metin.txt","r",encoding="UTF-8") as f: yazi=f.read() kelimeSayisi={kelime:yazi.count(kelime) for kelime in set(yazi.split())} print(kelimeSayisi) enCokTekrarEdenKelime= max(kelimeSayisi,key=kelimeSayisi.get) print(f"en sık geçen kelime : {enCokTekrarEdenKelime}
Kodun çıktısı şu şekilde olacaktır:
Bu örnekte, bir metin dosyasındaki kelimelerin sayısını hesaplamak için list comprehension kullanıyoruz. İlk olarak, with ifadesi kullanarak metin dosyasını açıyoruz. Dosya okunur ve yazi adlı bir dizeye atanır. Daha sonra, set fonksiyonu kullanarak metindeki farklı kelimeleri elde ederiz. Son olarak, her kelimenin sayısını hesaplamak için sözlük oluştururuz. En sık geçen kelimeyi de max() fonksiyonunu kullanarak hesaplarız.
Burada dikkatinizi çekmek istediğim nokta, eğer set() kullanmazsak, yazi.split() fonksiyonu ile ayrılan bütün kelimeleri bir liste olarak elde ederiz. Daha sonra, bu kelimeler üzerinde döngü yaparak her bir kelimenin sayısını hesaplamak için dictionary comprehension kullanırız. Ancak, bu yöntemde her bir kelimenin sayısını hesaplamak için bütün metin üzerinde döngü yapmak gerektiği için performans açısından bir sorun oluşabilir.
Ayrıca, her bir kelimenin sadece bir kez hesaplanması gerektiği için, tekrarlayan kelimelerin hesaba katılması anlamsızdır. Bu nedenle, set() fonksiyonu kullanılarak yalnızca benzersiz kelimelerin bir kümesi elde edilir ve bu küme üzerinde döngü yapılır. Bu sayede, her kelimenin sadece bir kez hesaplanması sağlanır ve performans da artar.
Dolayısıyla, set fonksiyonunu kullanmadan önce, tüm metindeki kelimelerin ayrıldığı bir liste oluşacak ve bu liste üzerinde döngü yaparak sözlük oluşturulacaktır. Bu durumda, her bir kelimenin sayısını hesaplamak için tüm metin üzerinde döngü yapmak gerektiği için performans kaybı olabilir.
Bu örnek, bir metin dosyasında yer alan kelimelerin sayısını hesaplamak için oldukça karmaşık bir yöntem kullanmaktadır. Ancak, list comprehension yapısı bu işlemi oldukça kısa ve öz bir şekilde gerçekleştirmemizi sağlamaktadır.
0 Yorum