İçeriğe geç

Menü

Berk Akademi
Birebir ders başvurusu Ücretsiz ön görüşme Ana Sayfa

Python’da sorted key Parametresi Nasıl Kullanılır?

python-sorted-key-parametresi-nasil-kullanilir
Bu yazıda neler var?
  1. Sıralama ölçütünü key parametresi nasıl belirler?
  2. sorted ile list.sort arasındaki fark nedir?
  3. Lambda ile farklı veri yapıları nasıl sıralanır?
  4. Lambda yerine fonksiyon ne zaman kullanılmalı?
  5. reverse ve eşit key değerleri sıralamayı nasıl etkiler?
  6. Öğrenci listesi iki ölçüte göre nasıl sıralanır?

python sorted key parametresi nasıl kullanılır sorusunun temel cevabı şudur: key, listedeki her elemandan sıralama sırasında kullanılacak bir karşılaştırma değeri üretir. sorted(), elemanları bu değerlere göre dizer ve sonuçta ölçüt değerlerini değil, özgün elemanları döndürür.

Yani key parametresi, “listeyi neye göre karşılaştırayım?” sorusunun cevabıdır. Bir metnin uzunluğunu, sözlükteki bir alanı ya da nesnenin bir özelliğini ölçüt yapmak istediğinde, bu ölçütü üreten işlevi key olarak verirsin.

Sıralama ölçütünü key parametresi nasıl belirler?

key için verdiğin işlev, her elemanı tek tek alır ve o elemanın karşılaştırmada kullanılacak değerini döndürür. Python, sıralama kararını bu değerler üzerinden verir. Ancak bu işlem elemanları dönüştürmez; sonuç listesinde yine başlangıçtaki kelimeler, sayılar, sözlükler veya nesneler bulunur.

kelimeler = ['karpuz', 'elma', 'muz']
sirali = sorted(kelimeler, key=len)
print(sirali)

# ['muz', 'elma', 'karpuz']

Bu örnekte eleman kelimenin kendisidir, ölçüt ise len işlevinin ürettiği uzunluktur. Eşleştirmeyi açıkça düşünürsen 'karpuz' için 6, 'elma' için 4, 'muz' için 3 elde edilir. Küçükten büyüğe sıralama bu sayılara göre yapılır, fakat çıktı olarak 6, 4, 3 değil, bu değerleri üreten kelimeler döner.

key=len yazarken len() kullanmamanın nedeni de budur. Burada len işlevinin kendisini verirsin; sıralama işlemi her eleman için bu işlevi kullanır. Ezber yerine şu soruyu sorabilirsin: “Elemanın kendisini değil, hangi özelliğini karşılaştırmalıyım?” Bu sorunun cevabı, çoğu key kullanımının temelidir.

sorted ile list.sort arasındaki fark nedir?

sorted ile list.sort arasındaki fark nedir?

sorted(), verilen iterable üzerinden yeni bir sıralı liste oluşturur. Bu nedenle kaynak liste korunur. list.sort() ise mevcut listeyi yerinde sıralar ve sıralı listeyi geri döndürmez. Çağrının sonucu None olur. sorted() farklı iterable türleriyle çalışabilirken list.sort() liste yöntemidir.

sayilar = [3, 1, 2]
yeni_liste = sorted(sayilar)
print(sayilar)
print(yeni_liste)

sayilar = [3, 1, 2]
donen_deger = sayilar.sort()
print(sayilar)
print(donen_deger)

# Çıktı:
# [3, 1, 2]
# [1, 2, 3]
# [1, 2, 3]
# None

İlk kullanımda sayilar değişmeden kalır ve sıralı sonuç yeni_liste değişkenine atanır. İkinci kullanımda aynı listenin içeriği değişir. donen_deger değişkeninin None olması, sort() yönteminin “yeni liste üret” değil, “bu listeyi güncelle” anlamına geldiğini gösterir. Bu yüzden sayilar = sayilar.sort() yazarsan değişkenin değeri sıralı liste değil, None olur.

Özellik sorted list.sort()
Kaynak listeye etki Kaynak listeyi değiştirmez Mevcut listeyi yerinde sıralar
Dönen sonuç Yeni sıralı liste None

Yeni bir sıralama sonucu saklamak veya kaynak veriyi korumak istediğinde sorted() daha uygundur. Elindeki listeyi doğrudan güncellemek istediğinde list.sort() kullanabilirsin. Benzer temel Python ayrımlarını incelemek için temel Python kavramlarını anlatan blog yazılarına göz atabilirsin.

Lambda ile farklı veri yapıları nasıl sıralanır?

“python sorted key parametresi nasıl kullanılır” sorusunun temel cevabı, key parametresine her elemandan karşılaştırmada kullanılacak değeri çıkaran bir işlev vermektir. Lambda ile bu işlevi kısa biçimde yazabilirsin. Sözlük, demet veya metin listelerinde değişen şey sıralama mantığı değil, lambda ifadesinin elemandan hangi değeri aldığıdır. key için tek bir argüman alan bir işlev ya da çağrılabilir nesne kullanılabilir.

kayitlar = [
    {"ad": "Ece", "not": 85},
    {"ad": "Mert", "not": 72},
    {"ad": "Ada", "not": 93},
]

sirali = sorted(kayitlar, key=lambda kayıt: kayıt['not'])
print(sirali)

Beklenen çıktı: [{'ad': 'Mert', 'not': 72}, {'ad': 'Ece', 'not': 85}, {'ad': 'Ada', 'not': 93}]. lambda kayıt: kayıt['not'], her sözlükteki not alanını çıkarır. Sıralama, kayıtların tamamı yerine bu sayısal değerler karşılaştırılarak yapılır.

kayitlar = [
    ("Ece", 85),
    ("Mert", 72),
    ("Ada", 93),
]

print(sorted(kayitlar, key=lambda kayıt: kayıt[1]))

Beklenen çıktı: [('Mert', 72), ('Ece', 85), ('Ada', 93)]. lambda kayıt: kayıt[1], her demetin ikinci elemanını seçer. Böylece adlar değil, puanlar karşılaştırılır; çıktıdaki elemanlar ise bütün demetler olarak korunur.

metinler = ["Python", "algoritma", "Kod"]

print(sorted(metinler, key=lambda metin: metin.lower()))

Beklenen çıktı: ['algoritma', 'Kod', 'Python']. lambda metin: metin.lower(), her metnin küçük harfli karşılığını ölçüt yapar. Sıralama bu dönüşmüş değerlerle yapılır, çıktıdaki metinler ise özgün yazım biçimleriyle kalır.

Nesnelerde de aynı yaklaşımı köşeli parantez yerine özellik erişimiyle kurabilirsin: lambda öğrenci: öğrenci.puan. Bu durumda karşılaştırma değeri, nesnenin puan özelliğinden alınır.

Lambda yerine fonksiyon ne zaman kullanılmalı?

Lambda yerine fonksiyon ne zaman kullanılmalı?

Ölçüt tek kullanımlık ve tek ifadeli olduğunda lambda kısa ve okunabilir kalır. Aynı ölçütü birden fazla yerde kullanacaksan veya ölçüte anlamlı bir ad vermek açıklığı artıracaksa def ile tanımlanan normal bir fonksiyon daha uygun olabilir. Özellikle boşlukları temizleme ve harf biçimini düzenleme gibi birkaç normalleştirme adımı varsa, bu adımları ayrı satırlarda göstermek kodu daha anlaşılır kılar.

Adlandırılmış fonksiyon da key argümanına doğrudan verilir. Fonksiyonu parantezle çağırmak yerine adını yazarsın; sıralama işlemi her kayıt için fonksiyondan dönen değeri karşılaştırma anahtarı olarak kullanır.

def ada_gore(kayıt):
    return kayıt["ad"].strip().lower()

kayıtlar = [
    {"ad": " Zeynep "},
    {"ad": "ayşe"},
    {"ad": " Berk"},
]

sirali = sorted(kayıtlar, key=ada_gore)
print([kayıt["ad"].strip() for kayıt in sirali])

Beklenen ad sırası: ['ayşe', 'Berk', 'Zeynep']. ada_gore önce ad değerinin başındaki ve sonundaki boşlukları strip() ile kaldırır, ardından lower() ile karşılaştırmayı küçük harfli değerler üzerinden yapar. Ölçütün adı açıkça görüldüğü için aynı fonksiyonu başka sıralamalarda da kullanabilirsin.

Bu tür ölçütleri farklı örneklerde uygulamak ve kodun için kişiye özel geri bildirim seçeneğini değerlendirmek istersen birebir Python dersleri hakkında bilgi edinebilirsin.

reverse ve eşit key değerleri sıralamayı nasıl etkiler?

reverse=True, key fonksiyonunun her eleman için ürettiği karşılaştırma değerlerine göre sıralama yönünü azalan sıraya çevirir. Notu ölçüt olarak seçtiğinde yüksek notlar önce gelir. Aynı key değerini üreten elemanların girişteki göreli sırası ise korunur; bu, kararlı sıralama davranışıdır.

ogrenciler = [
    {"ad": "Deniz", "not": 90},
    {"ad": "Ayşe", "not": 75},
    {"ad": "Bora", "not": 90},
]

sirali = sorted(
    ogrenciler,
    key=lambda ogrenci: ogrenci["not"],
    reverse=True
)

print([(ogrenci["ad"], ogrenci["not"]) for ogrenci in sirali])

Beklenen çıktı: [('Deniz', 90), ('Bora', 90), ('Ayşe', 75)]

Deniz ve Bora için karşılaştırma değeri 90 olduğu için ikisi aynı gruptadır. Deniz, giriş listesinde Bora'dan önce yer aldığı için bu iki elemanın kendi arasındaki sıra değişmez. reverse=True notları yüksekten düşüğe dizer, eşit notlu kayıtlar için kendiliğinden alfabetik bir sıralama kuralı eklemez.

Öğrenci listesi iki ölçüte göre nasıl sıralanır?

python sorted key parametresi nasıl kullanılır sorusunu iki ölçütle çözerken key değerini bir demet olarak döndürebilirsin. İlk değer ana ölçütü, ikinci değer eşitlik durumunda kullanılacak ölçütü temsil eder. Python'da demetler soldan sağa karşılaştırıldığı için önce nota, gerekirse ada bakılır.

  1. Önce ölçütü seç: Notlar yüksekten düşüğe, eşit notlar ise ada göre artan biçimde sıralanacak.
  2. Sonra veri yapısına uygun key yaz: Sözlükteki not ve ad alanlarını okuyup iki parçalı bir demet döndür.
  3. Son olarak eşit değerlerde beklenen sırayı kontrol et: Aynı nota sahip öğrencilerde ikinci demetin ad sırasını belirlediğini doğrula.
ogrenciler = [
    {"ad": "Ece", "not": 85},
    {"ad": "Bora", "not": 92},
    {"ad": "Ali", "not": 92},
    {"ad": "Zeynep", "not": 78},
]

sirali = sorted(
    ogrenciler,
    key=lambda öğrenci: (-öğrenci['not'], öğrenci['ad'].lower())
)

for öğrenci in sirali:
    print(öğrenci["ad"], öğrenci["not"])

Beklenen çıktı:

Ali 92
Bora 92
Ece 85
Zeynep 78

-öğrenci['not'] kullanımı, varsayılan artan sıralamayı korurken yüksek notların önce gelmesini sağlar. Örneğin Ali için anahtar (-92, "ali"), Bora için ise (-92, "bora") olur. İlk değerler eşit olduğu için ikinci değerler karşılaştırılır ve ali, bora'dan önce gelir. Demet anahtarlarının soldan sağa karşılaştırılması bu çok ölçütlü sıralama mantığını oluşturur.

Burada reverse=True kullanılsaydı tüm demet ters yönde karşılaştırılacak, eşit notlarda ad sırası da tersine dönecekti. Bu nedenle yalnızca not ölçütünü azalan yapmak için negatif not kullanılır; ad ölçütü ise artan yönde bırakılır.

Örneği farklı öğrenci listeleriyle denedikten sonra seviyeni ölçmek için ücretsiz Python bilgi testi çözebilirsin.

Sıralama ölçütlerini önce belirleyip sonra key içinde açıkça ifade ettiğinde, eşit değerlerde oluşacak sonucu önceden öngörmek kolaylaşır.

Bu içerik aradığın cevabı verdi mi?
Yanıtın, hangi yazıları geliştirmemiz gerektiğini anlamamıza yardımcı olur.
Bu içeriğin üretilmesinde yapay zeka araçlarından destek alınmıştır.

Bu konudan sonra ne okuyabilirsin?

Tüm yazılar

İlgili Eğitimler

Berk Keskin, yazılım geliştirici ve eğitmen
Yazar

Berk Keskin Kimdir?

Yazılıma 12 yaşında başladı; İzmir Ekonomi Üniversitesi'ni bölüm birincisi ve yüksek şeref öğrencisi olarak tamamladı. Bugün yalnızca eğitim vermekle kalmıyor, sektörde aktif olarak yazılım projeleri geliştiriyor ve gerçek dünya deneyimini birebir derslerine taşıyor. Ezberden uzak, mühendislik zihniyetini merkeze alan sürdürülebilir öğrenme sistemleri tasarlayarak sorgulayan, üreten ve problem çözebilen yeni nesil yazılımcılar yetiştiriyor.

Sektörel Deneyim & Projeler

  • Ticarify Entegrasyon Yazılım logosu CEO Ticarify Entegrasyon YazılımPazaryerleri ve e-ticaret sitelerine otomatik e-fatura kesimi, sipariş ve kargo takibi hizmetleri sunan e-Dönüşüm platformunun API mimarisini ve yazılım ekibini yönetmektedir.
  • Benim Düğünüm logosu CEO Benim DüğünümDijital etkinlik ve anı paylaşım platformu.
  • Siberdizayn logosu Yazılım Ekibi Lideri SiberdizaynYüksek anlık oyuncu trafiğine sahip oyun kontrol panelleri ve sunucu altyapıları geliştiren yazılım ekibine liderlik etmektedir.
  • MEDYOGRAFYA 360° Dijital Çözümler logosu Dijital Strateji Lideri MEDYOGRAFYA 360° Dijital ÇözümlerŞirketlerin dijital çözümlerde uzun vadede nasıl ilerlemesi gerektiği ve dijital dönüşüm süreçlerinin yönetilmesine destek olmaktadır.
  • İzmir Ekonomi Üniversitesi logosu Danışma Kurulu Üyesi İzmir Ekonomi ÜniversitesiMezun olduğu üniversitesinde, Bilgisayar Programcılığı bölümünün akademik müfredatını güncel sektör ihtiyaçlarına göre şekillendirmek adına Danışma Kurulu'nda görev almaktadır.
WhatsApp Hemen Ara