Bir text ifadesindeki türkçe karakterleri, sözlük yapılarından yararlanarak İngilizce karaktere çevirip bastırmak

Sözlükler belgelerde de anlatıldığı üzere “mapping” denilen, aynı olması gerekmeyen iki veri tipine ait elemanları birbirine eşleyen bir başka veri yapısıdır. Yani bir nevi fonksiyondurlar, iki sonlu küme arasında kullanıcının belirttiği eşlemeyi temsil ederler.

:'nın solundakiler tanım kümesindeki elemanlara, sağındakiler ise değer kümesindeki elemanlara tekabül ediyor. Python’da değer kümesine koyabileceğiniz veri tipi üzerine herhangi bir sınırlama yok - ne isterseniz koyabilirsiniz: str, list, dict, tuple, complex veya kendi yazdığınız herhangi bir sınıfın örnekleri. Solundaki elemanların ise hashable olması şart koşuluyor, yani __hash__ ve __eq__ metotlarına uygun bir şekilde sahip olması gerekiyor (örneğin str, int, float, tuple* gibi tipler hashable, ama mesela list değil).

Belgelerde çok daha iyi bir anlatımı var ve "neden kullanmalıyız"a cevabı da oradadır ama, en öne çıkan özelliklerinden bir tanesi bir değerin mevcudiyetinin kontrolünün O(1) zamanlı olması yani tabir-i caizse anlık karar verebilme. Bu, listelerde O(N)e tekabül ediyor, N listenin uzunluğu. Bu “O” notasyonuna gerekli yerlerden bakarsınız ama aşağı yukarı şöyle düşünebilirsiniz: elimizdeki bir değerin verilen bir listede olup olmadığını anlamak için ortalama senaryoda elemanların yarısına kadar listeyi gezmemiz gerekir, ancak sözlüğün içerisinde arıyorsak “tak” diye olup olmadığını anlayabiliyoruz, bu da hashing sayesinde.

Buradan hareketle

şeklinde bir kullanım sözlüklerin doğasına çok ters düşmekte. Bunun yerine

for harf in text:
    if harf in blocked_letters:
        ...

şeklinde direkt sözlük üzerinden eleman bulunup bulunmama durumunu kontrol etmeliyiz. (Tabii bu for - if - append basamakları list-comprehension’ı çağırıyor, orayı halledersiniz.)

Yine harf-harf bir for dönersiniz. Eğer ilgili harf blocked_letttersa aitse, blocked_letters’ta bu harfe “karşılık” gelen harfi bastırırsınız. Eğer değilse…

Veya, str.maketrans/translate var, ama ilkini yapsanız sözlüklerle aranız daha iyi olur.

Tekrarlayayım, belgelerde çok daha iyi bir anlatımı var, oraya bir göz attıktan sonra yazdığınız kodu tekrar yazabilirsiniz ve istediğiniz eklemeyi gerçekleştirebilirsiniz, şu kısmı da anlamak dahil (her ne kadar yazan kişi çok yorum yazmamış olsa da!)


*: hashable olmayan tip içeren tuple'lar makul bir şekilde hashable sayılmıyormuş :d örn. (4, 7, [-5, -1])

Belgelerde “immutability” şart koşulmuş ama “hashable” olması gerek aslında diye düşünüyorum, zira bu unhashable içeren tuple bir örnek teşkil edebilir. Ama o da artık immutable’lıktan çıkmış mıdır… Yine de hashable olup immutable olmayan bir custom class yazılabilir heralde, bilemiyorum…