Bir önceki kartta kelime sayacını get() ile kurmuştuk: boş sözlük, for döngüsü, sayac.get(k, 0) + 1. Python’un hazır gelen collections modülünde aynı işi tek satırda yapan bir araç var: Counter.
Kod
from collections import Counterkelimeler = ["python", "veri", "python", "bilim"]sayac = Counter(kelimeler)print(sayac) # Counter({'python': 2, 'veri': 1, 'bilim': 1})print(sayac.most_common(2)) # [('python', 2), ('veri', 1)]print(sayac["python"]) # 2print(sayac["java"]) # 0
Counter bir listeyi alıyor ve her elemanın kaç kez geçtiğini tutan bir sözlük döndürüyor. most_common(n) en sık geçen n elemanı büyükten küçüğe veriyor. Eşit sayıları olanlar listede ilk görüldükleri sırayla geliyor; “veri”nin “bilim”den önce gelmesinin sebebi bu.
Son satıra dikkat: Normal bir sözlükte olmayan anahtar KeyError verirdi. Counter ise 0 döndürüyor, çünkü “hiç görülmedi” ile “0 kez görüldü” aynı şey. Bu get(k, 0) ile yaptığımızın hazır hali.
Metinde de çalışır
Counter‘a bir metin verirsen harfleri sayar:
print(Counter("bilgisayar").most_common(2)) # [('i', 2), ('a', 2)]
Birkaç kullanışlı özellik
sayac.update(["veri", "veri"]) # yeni elemanları sayıma ekleprint(sayac) # Counter({'veri': 3, 'python': 2, 'bilim': 1})print(sum(sayac.values())) # 6 toplam kelimeprint(len(sayac)) # 3 farklı kelimea = Counter(elma=3, muz=1)b = Counter(elma=1, kiraz=2)print(a + b) # Counter({'elma': 4, 'kiraz': 2, 'muz': 1})print(a - b) # Counter({'elma': 2, 'muz': 1})
İki sayacı toplayabilir ya da birinden diğerini çıkarabilirsin. Çıkarmada sıfır ya da eksi kalanlar listeden düşüyor; kirazın sonuçta olmamasının sebebi bu.
Dikkat: saymadan önce temizle
Counter ne verirsen onu sayar. Metni temizlemeden verirsen sonuç yanıltır:
metin = "Python öğrenmek eğlenceli. python ile veri analizi de eğlenceli!"print(Counter(metin.split()).most_common(2))# [('Python', 1), ('öğrenmek', 1)] "Python" ile "python" farklı sayıldıtemiz = [k.strip(".,!?").lower() for k in metin.split()]print(Counter(temiz).most_common(2))# [('python', 2), ('eğlenceli', 2)]
Büyük-küçük harf ve noktalama yüzünden aynı kelime farklı sayılıyor. Türkçe metinlerde lower() yerine Python Dersi 11’deki tr_lower fonksiyonunu kullanmayı da unutma.
Sözlükleri Python Dersi 8’de, get() kartını Kod Kartı #06’da, metin temizliğini Python Dersi 11’de anlattım.






