Sözlükler

Şu ana kadar Python’da iki önemli veri tipinden bahsettik. Bunlar listeler ve demetler idi. Şimdi de sözlük adlı veri tipinden söz edeceğiz. Sözlükler Python’un en önemli veri tiplerinden bir tanesidir. Bu veri tipini öğrendikten sonra pek çok şeyi rahatlıkla yapabildiğinizi görecek, ufkunuzun genişlediğini hissedeceksiniz.

O halde lafı daha fazla uzatmadan yola koyulalım.

Sözlük Oluşturmak

Sözlükleri kullanabilmek için yapmamız gereken ilk iş sözlüğü oluşturmak olacaktır. Python’da sözlükleri şöyle oluşturuyoruz:

>>> sozluk = {}

Gördüğünüz gibi, sözlüklerin ayırt edici işareti küme parantezleridir. Yukarıda boş bir sözlük oluşturduk. Gelin isterseniz bunu test edelim:

>>> type(sozluk)

<type 'dict'>

Hatırlarsanız, listeleri tanımlayan sözcük “list”, demetleri tanımlayan sözcük ise “tuple” idi. Gördüğünüz gibi sözlükleri tanımlayan sözcüğümüz de “dict”...

Yukarıda boş bir sözlük oluşturduk. Dilerseniz şimdi de öğeleri olan bir sözlük oluşturalım:

>>> sozluk = {"elma": "meyve", "domates": "sebze", 1: "sayi"}

Sözlükler görünüş açısından öteki veri tiplerinden biraz farklıdır. Liste ve demet gibi veri tiplerinde her bir öğeyi birbirinden virgül ile ayırıyorduk. Aslında sözlüklerde de durum böyledir. Yani sözlüklerde de öğeleri birbirlerinden virgül ile ayırıyoruz. Ama gördüğünüz gibi, öğelerin biçiminde bazı farklılıklar var.

Sözlükler, anahtar-değer çiftlerinden oluşan bir veri tipidir. Burada mesela, elma bir “anahtar”, meyve ise bu anahtarın “değeri”dir. Aynı şekilde sebze değerinin anahtarı domates, sayi değerinin anahtarı ise 1‘dir. Dolayısıyla Python’da sözlük; “anahtar” ve “değer” arasında bağ kuran bir veri tipidir diyoruz.

Bu durumu daha net anlayabilmek için bir örnek daha verelim:

>>> sozluk = {"Adana": "01", "İstanbul": "34", "İzmir": "35"}

Bu sözlük üç öğeden oluşuyor. Bunu şu şekilde teyit edebilirsiniz:

>>> len(sozluk)

3

Bu sözlüğün her öğesi bir “anahtar-değer” çiftidir. Mesela Adana anahtar, 01 ise bu anahtarın değeridir.

Bir örnek daha verelim. Mesela sözlükleri kullanarak bir telefon defteri yazalım:

>>> telefon_defteri = {"Ahmet": "0533 123 45 67",
... "Salih": "0532 321 54 76",
... "Selin": "0533 333 33 33"}

Burada kodlarımızın sağa doğru biçimsiz bir biçimde uzamaması için virgülden sonra ENTER tuşuna basarak öğeleri tanımlamaya devam ettiğimize dikkat edin. Sağa doğru çok fazla uzamış olan kodlar hem görüntü açısından hoş değildir, hem de görüş alanını dağıttığı için okumayı zorlaştırır.

İsterseniz bir de yukarıdaki kodların metin düzenleyici içinde nasıl görüneceğine bakalım:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

telefon_defteri = {"Ahmet": "0533 123 45 67",
                   "Salih": "0532 321 54 76",
                   "Selin": "0533 333 33 33"}

print telefon_defteri

Kodlarımızı daha okunaklı bir hale getirmek için sözlüğü uygun yerlerinden bölerek alt satıra geçiyoruz. Unutmayın, kod bir kez yazılır bin kez okunur. Okunaklı ve anlaşılır kodlar yazmak herkesin hayrınadır. Neyse, biz konumuza dönelim.

Sözlük tanımlarken dikkat etmemiz gereken birkaç nokta var. Bunlardan birincisi öğeleri belirlerken küme parantezlerini kullanıyor olmamız. İkincisi karakter dizilerinin yanısıra sayıları da tırnak içinde gösteriyor olmamız. İsterseniz sayıları tırnaksız kullanırsanız ne olacağını deneyerek görebilirsiniz. Ancak eğer gireceğiniz sayı boşluklu değilse ve 0 ile başlamıyorsa bu sayıyı tırnaksız da yazabilirsiniz. Üçüncüsü iki nokta üst üste ve virgüllerin nerede, nasıl kullanıldığına da dikkat etmeliyiz.

Sözlükleri nasıl oluşturacağımızı öğrendik. Şimdi gelelim bu sözlükleri nasıl kullanacağımıza...

Sözlük Öğelerine Erişmek

Bir sözlük oluşturduktan sonra, tabii ki bu sözlüğün öğelerine erişmek isteyeceksiniz. Bir sözlüğün tamamını ekrana dökmek için yapmamız gereken şey belli:

>>> sozluk = {"Python": "programlama dili",
... "İngilizce": "dil", "elma": "meyve"}

>>> print sozluk

print komutunu kullanarak bir sözlüğün tamamını ekrana dökebiliyoruz. Peki ya biz bu sözlüğün öğelerine tek tek erişmek istersek ne yapacağız?

Hatırlarsanız liste ve demetlerin öğelerine tek tek şu şekilde erişiyorduk:

>>> liste = ["Ali", "Ahmet", "Mehmet"]

>>> liste[0]

'Ali'

>>> demet = ("Ali", "Ahmet", "Mehmet")

>>> demet[1]

'Ahmet'

Liste ve demetlerde öğeleri sıralarına göre çağırabiliyoruz. Çünkü liste ve demetler sıralı veri tipleridir. Yani liste ve demetlerdeki öğelerin her birinin bir sırası vardır. Ancak sözlükler öyle değildir. Sözlüklerde herhangi bir sıra kavramı bulunmaz. Mesela şu örneğe bakalım:

>>> a = {"a": 1, "b": 2, "c": 3}

>>> print a

{'a': 1, 'c': 3, 'b': 2}

Gördüğünüz gibi, öğeler tanımladığımız sırada görünmüyor. Sözlüklerde herhangi bir sıra kavramı olmadığı için şöyle bir girişim başarısızlığa uğrayacaktır:

>>> a[0]

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 0

Sözlükler sırasız bir veri tipi olduğu için, sözlük öğelerini sıralarına göre değil, isimlerine göre çağırıyoruz.

Şuna bir bakalım:

>>> telefon_defteri = {"Ahmet": "0533 123 45 67",
... "Salih": "0532 321 54 76",
... "Selin": "0533 333 33 33"}

>>> telefon_defteri["Ahmet"]

'0533 123 45 67'

>>> telefon_defteri["Salih"]

'0532 321 54 76'

Gördüğünüz gibi, bu komutlar Ahmet ve Salih adlı anahtarların karşısında hangi değer varsa onu ekrana yazdırıyor. Dikkat edin, sözlükten öğe çağırırken küme parantezlerini değil, köşeli parantezleri kullanıyoruz. Bu arada aklınızda bulunsun, sözlük içindeki öğeleri anahtara göre çağırıyoruz, değere göre değil. Yani iki nokta üst üste işaretinin solundaki ifadeleri kullanıyoruz öğeleri çağırırken, sağındakileri değil...

Sözlüklere Öğe Eklemek

Sözlüklere öğe eklemek son derece kolay bir işlemdir. Diyelim ki elimizde şöyle boş bir sözlük var:

>>> sozluk = {}

Bu sözlüğe öğe eklemek için şu yapıyı kullanıyoruz:

>>> sozluk[anahtar] = deger

Dilerseniz bu yapıyı somutlaştıracak bir örnek verelim:

>>> sozluk["Ad"] = "Ahmet"

Burada “Ad” bir anahtar, “Ahmet” ise bir değerdir. Yani sözlüklere öğe eklemek için hem bir anahtar, hem de bir değer belirtmemiz gerekiyor. Mesela bu sözlüğe bir öğe daha ekleyelim:

>>> sozluk["Soyad"] = "Su"

Şimdi sözlüğümüzü yazdıralım:

>>> print sozluk

{'Ad': 'Ahmet', 'Soyad': 'Su'}

Gördüğünüz gibi öğelerimiz sözlüğe eklenmiş. Bu yapıyı ve for döngüsünü kullanarak sözlüklere birden fazla öğeyi bir çırpıda ekleyebilirsiniz:

>>> liste = dir(list)

>>> sozluk = {}

>>> for anahtar, deger in enumerate(liste):
...     sozluk[anahtar] = deger

>>> print sozluk

{0: '__add__', 1: '__class__', 2: '__contains__', 3: '__delattr__',
4: '__delitem__', 5: '__delslice__', 6: '__doc__', 7: '__eq__',
8: '__format__', 9: '__ge__', 10: '__getattribute__', 11: '__getitem__',
12: '__getslice__', 13: '__gt__', 14: '__hash__', 15: '__iadd__',
16: '__imul__', 17: '__init__', 18: '__iter__', 19: '__le__',
20: '__len__', 21: '__lt__', 22: '__mul__', 23: '__ne__', 24: '__new__',
25: '__reduce__', 26: '__reduce_ex__', 27: '__repr__', 28: '__reversed__',
29: '__rmul__', 30: '__setattr__', 31: '__setitem__', 32: '__setslice__',
33: '__sizeof__', 34: '__str__', 35: '__subclasshook__', 36: 'append',
37: 'count', 38: 'extend', 39: 'index', 40: 'insert', 41: 'pop',
42: 'remove', 43: 'reverse', 44: 'sort'}

Gördüğünüz gibi dir(list) çıktısındaki öğeleri tek tek numaralandırıp bunları sözlüğe ekledik. Böylece artık liste metotlarını numara vererek çağırabiliriz:

>>> sozluk[1]

'__class__'

>>> sozluk[10]

'__getattribute__'

>>> sozluk[20]

'__len__'

>>> sozluk[36]

'append'

>>> sozluk[40]

'insert'

Yukarıdaki örnekte, sözlük anahtarları birer sayı olduğu için çıktıda öğeler sıralı olarak görünüyor. Bu, Python’daki sözlüklerin iç tasarımından kaynaklanan tesadüfi bir durumdur. Ne olursa olsun, sözlüklerde sıra kavramına güvenerek iş yapmamak gerekir. Mesela şu örneğe bakın:

>>> kayitlar = {}

Burada öncelikle boş bir sözlük oluşturduk. Bu sözlüğe tek tek öğe ekleyeceğiz:

>>> kayitlar["Ad"] = "Ahmet"
>>> kayitlar["Soyad"] = "Okan"
>>> kayitlar["Meslek"] = "Mimar"

Böylece sözlüğümüze üç farklı öğe eklemiş olduk. Şimdi bu sözlüğü ekrana dökelim:

>>> kayitlar

{'Soyad': 'Okan', 'Ad': 'Ahmet', 'Meslek': 'Mimar'}

Gördüğünüz gibi, öğe sıralaması bozulmuş...

Bu arada, eğer kendi kendinize denemeler yapmışsanız, sözlüklerin Türkçe karakterleri düzgün gösteremediğini farketmişsinizdir. Örneğin:

>>> stok = {"Çilek": "100 kilo",
... "Şeker": "5 kilo",
... "Çay": "10 kilo",
... "Kaşık": "100 adet"}

>>> print stok

{'\x80ay': '10 kilo', '\x9eeker': '5 kilo',
'Ka\x9f\x8dk': '100 adet', '\x80ilek': '100 kilo'}

Gördüğünüz gibi, Türkçe karakterlerin hiçbiri düzgün görüntülenemiyor. Hatırlarsanız buna benzer durumlarla listelerde de karşılaşmıştık. Orada bu sorunu çözmek için for döngüsünden yaralanmıştık. Sözlükler için de aynı yöntemi kullanabiliriz:

>>> for i in stok:
...     print i

Çay
Şeker
Kaşık
Çilek

Bu sözlükteki öğelere, herhangi bir Türkçe karakter sorunu yaşamadan, normal bir şekilde erişebiliyoruz:

>>> print stok["Çay"]

>>> print stok["Şeker"]

Sözlük Öğelerini Değiştirmek

Bir önceki bölümde sözlüklere nasıl öğe ekleyeceğimizi gördük. Buna göre şöyle bir örnek verebiliyoruz:

>>> telefon_defteri = {}

>>> telefon_defteri["Zekiye"] = "0544 444 01 00"

>>> print telefon_defteri

{'Zekiye': '0544 444 01 00'}

Peki sözlüğümüzdeki bir öğenin değerini değiştirmek istersek ne yapacağız? Onu da şöyle yapıyoruz

>>> telefon_defteri["Zekiye"] = "0555 555 55 55"

Böylece sözlükteki Zekiye anahtarının değerini değiştirmiş olduk.

Buradan anladığımız şu: Bir sözlüğe yeni bir öğe eklerken de, varolan bir öğeyi değiştirirken de aynı komutu kullanıyoruz. Demek ki bir öğeyi değiştirirken aslında öğeyi değiştirmiyor, silip yerine yenisini koyuyoruz.

Bu arada, sözlük öğelerinde büyük-küçük harfin önemli olduğuna dikkat edin:

>>> telefon_defteri["zekiye"] = "0555 555 55 55"

>>> telefon_defteri

{'zekiye': '0555 555 55 55', 'Zekiye': '0555 555 55 55'}

“Zekiye” ve “zekiye” aynı görünse de aslında Python açısından bunların ikisi tamamen birbirinden farklıdır...

Sözlük Öğelerini Silmek

Eğer bir öğeyi sözlükten silmek istersek şu komutu kullanıyoruz:

>>> del telefon_defteri["Salih"]

Eğer biz sözlükteki bütün öğeleri silmek istersek şu komut kullanılıyor:

>>> telefon_defteri.clear()

Böylece boş bir sözlük elde etmiş olduk. Eğer sözlüğü tamamen ortadan kaldırmak isterseniz yine del komutundan yararlanabilirsiniz:

>>> del telefon_defteri

Yukarıdaki örneklerden birinde gördüğümüz clear() ifadesi, Python sözlüklerinin metotlarından biridir. Sözlüklerin bunun dışında başka metotları da vardır. Dilerseniz şimdi bu metotları inceleyelim.

Sözlüklerin Metotları

Demetlerin aksine, sözlükler üzerinde değişiklik yapabiliriz. Dolayısıyla sözlükler de, tıpkı listeler gibi, metot bakımından zengin bir veri tipidir. Sözlüklerin metotlarını listelemek için şu yöntemlerden herhangi birini izleyebilirsiniz:

>>> dir(dict)

>>> dir({})

>>> d = {}

>>> dir(d)

Bu yöntemlerin herhangi birini takip ettiğinizde şöyle bir çıktı elde edeceksiniz:

['__class__', '__cmp__', '__contains__', '__delattr__', '__delitem__',
'__doc__', '__eq__', '__format__', '__ge__', '__getattribute__',
'__getitem__', '__gt__', '__hash__', '__init__', '__iter__', '__le__',
'__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__',
'__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__',
'__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'has_key', 'items',
'iteritems', 'iterkeys', 'itervalues', 'keys', 'pop', 'popitem',
'setdefault', 'update', 'values']

Burada bizi ilgilendirenler, her zamanki gibi şunlar olacaktır:

>>> for i in dir(dict):
...     if "_" not in i[0]:
...         print i
clear
copy
fromkeys
get
has_key
items
iteritems
iterkeys
itervalues
keys
pop
popitem
setdefault
update
values

Şimdi bu metotların en önemlilerini inceleyeceğiz.

keys() ve values()

Sözlük metotları arasında en önemlileri bu keys() ve values() adlı metotlardır. Kabaca söylemek gerekirse keys() metodu bir sözlükteki anahtarları, values() metodu ise sözlükteki değerleri verir.

Mesela:

>>> telefon_defteri = {"Ahmet": "0533 123 45 67",
... "Salih": "0532 321 54 76", "Selin": "0533 333 33 33"}

>>> print telefon_defteri.keys()

['Ahmet', 'Salih', 'Selin']

>>> print telefon_defteri.values()

['0533 123 45 67', '0532 321 54 76', '0533 333 33 33']

clear(), pop() ve popitem()

clear() metodu bir sözlüğün bütün öğelerini siler:

>>> telefon_defteri = {"Ahmet": "0533 123 45 67",
... "Salih": "0532 321 54 76", "Selin": "0533 333 33 33"}

>>> telefon_defteri.clear()

>>> telefon_defteri

{}

Gördüğünüz gibi, sözlük tamamen boşaldı.

pop() metodu bir sözlükteki öğeleri adlarına göre siler ve ekrana basar:

>>> telefon_defteri = {"Ahmet": "0533 123 45 67",
... "Salih": "0532 321 54 76", "Selin": "0533 333 33 33"}

>>> telefon_defteri.pop("Ahmet")

'0533 123 45 67'

Gördüğünüz gibi, sözlükteki Ahmet anahtarını sildik. Bu anahtar silinirken, bunun değeri de ekrana basıldı.

popitem() metodu ise bir sözlükteki rastgele bir anahtarı siler ve silinen anahtarın değerini ekrana basar:

>>> telefon_defteri.popitem()

('Selin', '0533 333 33 33')

Bu silme şekli tamamen tesadüfidir. Hangi öğenin silineceğini kontrol edemezsiniz.

items() ve iteritems()

items() metodu bir sözlük içindeki anahtar ve değerleri listeler:

>>> telefon_defteri.items()

[('Selin', '0533 333 33 33'), ('Ahmet', '0533 123 45 67'),
('Salih', '0532 321 54 76')]

Gördüğünüz gibi, burada sözlük içindeki bütün anahtar ve değerleri bir liste içinde yer alıyor. Her anahtar ve değer çifti de birer demet biçiminde.

Yukarıda bir demet dizisi elde ettiğimize göre, bu demetleri şu şekilde çözebiliriz (Bu işleme İngilizce’de “unpacking” adı veriliyor):

>>> for k, v in telefon_defteri.items():
...    print k, v

Selin 0533 333 33 33
Ahmet 0533 123 45 67
Salih 0532 321 54 76

iteritems() metodu da bir sözlük içindeki anahtar ve değerleri listeler. Ancak items() metodu ile iteritems() metodu arasında bazı kullanım farkları vardır. Örneğin:

>>> telefon_defteri.iteritems()

<dictionary-itemiterator object at 0x00EC2AB0>

Gördüğünüz gibi, iteritems() metodu listeyi çıktı olarak vermedi. Bu durum iteritems() metodunun çok önemli bir özelliğidir. items() metodu, anahtar-değer çiftlerinden oluşan listeyi derhal meydana getirip ekrana basar. iteritems() metodu ise anahtar-değer çiftlerinden oluşan listeyi meydana getirdiğini bildiren bir “nesne” üretir. iteritems() metodu ile oluşturduğunuz listeyi siz istediğiniz zaman ekrana dökebilirsiniz:

>>> for anahtar, deger in telefon_defteri.items():
...     print anahtar, deger
...
Selin 0533 333 33 33
Ahmet 0533 123 45 67
Salih 0532 321 54 76

iteritems() metodu, bu özelliği sayesinde çok büyük listeler üzerinde daha performanslı çalışacaktır.

iterkeys() ve itervalues()

Bu iki metot, biraz önce gördüğümüz keys() ve values() metotlarıyla aynı işi yapar. Bu metot çifti arasındaki fark, items() ve iteritems() metotları arasındaki fark gibidir.

copy()

Bu metot bir sözlüğü kopyalamamızı sağlar:

>>> yeni_rehber = telefon_defteri.copy()

get() ve has_key()

Eğer amacınız bir anahtarın sözlük içinde varolup olmadığını denetlemekse has_key() metodundan yararlanabilirsiniz:

>>> telefon_defteri.has_key("Veli")

False

>>> telefon_defteri.has_key("Selin")

True

Buna benzer bir şeyi şöyle de yapabileceğimizi görmüştük:

>>> telefon_defteri["Selin"]

'0533 333 33 33'

>>> telefon_defteri["Veli"]

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'Veli'

Gördüğünüz gibi, eğer aranan anahtar sözlükte varsa o anahtarın değeri ekrana basılıyor. Ama eğer aranan anahtar sözlükte yoksa bir hata mesajı alıyoruz. Normalde bu hata mesajını almamak için try... except: bloklarından yararlanabiliriz:

>>> try:
...     telefon_defteri["Veli"]
... except KeyError:
...     print "Aranan öğe sözlükte yok!"
...
Aranan öğe sözlükte yok!

Ancak Python’da bunu yapmanın çok daha kolay bir yolu var. Şimdi şu senaryoyu inceleyin:

Diyelim ki bir hava durumu programı yazmak istiyoruz. Tasarımıza göre kullanıcı bir şehir adı girecek. Program da girilen şehre özgü hava durumu bilgilerini ekrana yazdıracak. Bunu yapabilmek için, daha önceki bilgilerimizi de kullanarak şöyle bir şey yazabiliriz:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

soru = raw_input("Şehrinizin adını tamamı küçük "
"harf olacak şekilde yazınız: ")

if soru == "istanbul":
    print "gök gürültülü ve sağanak yağışlı"

elif soru == "ankara":
    print "açık ve güneşli"

elif soru == "izmir":
    print "bulutlu"

else:
    print ("Bu şehre ilişkin havadurumu "
    "bilgisi bulunmamaktadır.")

Ama yukarıdaki yöntemin, biraz meşakkatli olacağı açık. Sadece üç şehir için hava durumu bilgilerini sorgulayacak olsak mesele değil, ancak onlarca şehri kapsayacak bir program üretmekse amacımız, yukarıdaki yöntem yerine daha pratik bir yöntem uygulamak gayet yerinde bir tercih olacaktır. İşte bu noktada programcının imdadına Python’daki sözlük veri tipi ve bu veri tipinin get() adlı metodu yetişecektir. Yukarıdaki kodların yerine getirdiği işlevi, şu kodlarla da gerçekleştirebiliriz:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

soru = raw_input("Şehrinizin adını tamamı küçük "
"harf olacak şekilde yazınız: ")

cevap = {"istanbul": "gök gürültülü ve sağanak yağışlı",
         "ankara": "açık ve güneşli", "izmir": "bulutlu"}

print cevap.get(soru, "Bu şehre ilişkin havadurumu "
"bilgisi bulunmamaktadır.")

Gördüğünüz gibi, ilk önce normal biçimde, kullanıcıya sorumuzu soruyoruz. Ardından da “anahtar-değer” çiftleri şeklinde şehir adlarını ve bunlara karşılık gelen hava durumu bilgilerini bir sözlük içinde depoluyoruz. Daha sonra, sözlük metotlarından biri olan get() metodunu seçiyoruz. Bu metot bize sözlük içinde bir değerin varolup olmadığını denetleme imkânının yanısıra, adı geçen değerin sözlük içinde varolmaması durumunda kullanıcıya gösterilecek bir mesaj seçme olanağı da sunar. Python sözlüklerinde bulunan bu get() metodu bizi else veya try-except blokları kullanarak hata yakalamaya uğraşma zahmetinden de kurtarır.

Burada print cevap.get(soru, "Bu şehre ilişkin hava durumu bilgisi bulunmamaktadır.") satırı yardımıyla soru adlı değişkenin değerinin sözlük içinde varolup varolmadığını sorguluyoruz. Eğer kullanıcının girdiği şehir adı sözlüğümüz içinde bir anahtar olarak tanımlanmışsa, bu anahtarın değeri ekrana yazdırılacaktır. Eğer kullanıcının girdiği şehir adı sözlüğümüz içinde bulunmuyorsa, bu defa kullanıcıya Bu şehre ilişkin hava durumu bilgisi bulunmamaktadır. biçiminde bir mesaj gösterilecektir.

if deyimleri yerine sözlüklerden yararlanmanın, yukarıda bahsedilen faydalarının dışında bir de şu yararları vardır:

  1. Öncelikle sözü geçen senaryo için sözlükleri kullanmak programcıya daha az kodla daha çok iş yapma olanağı sağlar.
  2. Sözlük programcının elle oluşturacağı “if-elif-else” bloklarından daha performanslıdır ve bize çok hızlı bir şekilde veri sorgulama imkânı sağlar.
  3. Kodların daha az yer kaplaması sayesinde programın bakımı da kolaylaşacaktır.
  4. Tek tek “if-elif-else” blokları içinde şehir adı ve buna ilişkin hava durumu bilgileri tanımlamaya kıyasla sözlük içinde yeni anahtar-değer çiftleri oluşturmak daha pratiktir.

Bölüm Soruları

1. Basit bir Türkçe-İngilizce sözlük programı yazın. Yazdığınız programda kullanıcı Türkçe bir kelime sorup, bu kelimenin İngilizce karşılığını alabilmeli.

2. Rakamla girilen sayıları yazıyla gösteren bir program yazın. Mesela kullanıcı “5” sayısını girdiğinde programımız “beş” cevabını vermeli.

3. Python sözlüklerinde sıra kavramı yoktur. Yani bir sözlüğe girdiğiniz değerler çıktıda sıralı olarak görünmeyebilir. Ancak bir sözlükte anahtarlar sayı olduğunda Python bu sayıları sıraya dizmektedir. Python’un sayı değerli anahtarlara neden böyle davrandığını araştırın. Anahtarların birer sayı olduğu sözlüklerle bazı denemeler yaparak, çıktıda görünen öğe sırasının hangi durumlarda bozulduğunu bulmaya çalışın. Mesela şu iki sözlüğün çıktılarını öğe sıralaması açısından karşılaştırın:

a = {3: "üç", 2: "iki", 7: "yedi", 10: "on"}

b = {3: "üç", 2: "iki", 8:"sekiz", 9: "dokuz",
     5: "beş", 6:"altı", 4: "dört", 1: "bir",
     7: "yedi", 10: "on"}

4. Şu örnekte neden i yerine i[0] yazdığımızı açıklayın:

>>> for i in dir(dict):
...     if "_" not in i[0]:
...         print i

5. Şu programı, tekrar tekrar çalışacak şekilde yeniden yazın:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

soru = raw_input("Şehrinizin adını tamamı küçük "
"harf olacak şekilde yazınız: ")

cevap = {"istanbul": "gök gürültülü ve sağanak yağışlı",
         "ankara": "açık ve güneşli", "izmir": "bulutlu"}

print cevap.get(soru, "Bu şehre ilişkin havadurumu "
"bilgisi bulunmamaktadır.")

Kullanıcı “q” tuşuna basarak programdan çıkabilmeli.

6. Aşağıdaki sözlüğün hem anahtarlarını hem de değerlerini ekrana basın:

>>> stok = {"Çilek": "100 kilo",
... "Şeker": "5 kilo",
... "Çay": "10 kilo",
... "Kaşık": "100 adet"}

Burada her anahtar ve değer şu biçimde görünmeli:

Depoda 10 kilo 'Çay' mevcuttur.
Depoda 5 kilo 'Şeker' mevcuttur.
Depoda 100 adet 'Kaşık' mevcuttur.
Depoda 100 kilo 'Çilek' mevcuttur.