Listeler

Bu bölümden itibaren Python’daki önemli veri tiplerini incelemeye başlayacağız. Burada inceleyeceğimiz veri tipleri sırasıyla şunlardır:

  1. Liste (list)
  2. Demet (tuple)
  3. Sözlük (dictionary)
  4. Küme (set)

Bu veri tipleri arasında özellikle listeler, Python’un en güçlü olduğu alanlardan biri olması bakımından ayrı bir yere ve öneme sahiptir. O yüzden ilk önce listeleri inceleyeceğiz.

Dilerseniz listenin ne demek olduğunu anlatmaya çalışmakla vakit kaybetmek yerine doğrudan konuya girelim. Böylece soyut kavramlarla kafa karıştırmadan ilerlememiz mümkün olabilir. Zaten ilk liste örneğini görür görmez bu veri tipinin nasıl bir şey olduğunu hemen anlayacaksınız.

Liste Oluşturmak

Listeleri kullanabilmek için öncelikle bir liste oluşturmamız gerekiyor. Python’da herhangi bir liste oluşturmak için önce listemize bir ad vermeli, ardından da köşeli parantezler içinde bu listenin öğelerini belirlemeliyiz. Yani liste oluştururken dikkat etmemiz gereken iki temel nokta var: Birincisi tıpkı değişkenlere isim veriyormuşuz gibi listelerimize de isim vereceğiz. Tabii listelerimizi isimlendirirken Türkçe karakterler kullanmayacağız. İkincisi, listemizi oluşturan öğeleri köşeli parantezler içinde yazacağız. Yani Python’da bir liste oluşturmak için şöyle bir yol izleyeceğiz:

>>> liste = []

Böylece ilk listemizi başarıyla oluşturmuş olduk. Gördüğünüz gibi, bir liste oluşturmak son derece kolay. Yapacağımız tek şey liste için bir ad belirlemek ve liste öğelerini köşeli parantez içine almak. Burada listemizin henüz herhangi bir öğesi yok. Yani listemiz şu anda boş. Gelin isterseniz öğeleri de olan bir liste oluşturmayı deneyelim:

>>> liste = ["Hale", "Jale", "Lale", 12, 23]

Böylece içinde öğe de barındıran, eksiksiz bir liste oluşturmuş olduk. İsterseniz oluşturduğumuz şeyin bir liste olduğunu teyit edelim:

>>> type(liste)

<type 'list'>

Tahmin edeceğiniz gibi, list kelimesi liste anlamına geliyor. Demek ki gerçekten de bir liste oluşturmuşuz...

Daha önce de söylediğimiz gibi, burada dikkat etmemiz gereken nokta, liste öğelerini oluştururken köşeli parantezler kullanıyor olmamız. Çünkü Python, listeleri parantez işaretlerinden ayırt eder.

Gördüğünüz gibi, liste içine öğe eklemek de zor değil. Liste içindeki karakter dizilerini her zamanki gibi tırnak içinde belirtmeyi unutmuyoruz. Tabii ki sayıları yazarken bu tırnak işaretlerini kullanmayacağız.

Olması gerektiği şekilde listemizi oluşturduk. Şimdi komut satırında:

>>> print liste

komutunu verdiğimizde, oluşturduğumuz bu liste adlı listenin öğeleri ekrana yazdırılacaktır.

Python’da liste oluşturmanın bir başka yolu da list() adlı bir fonksiyondan yararlanmaktır. Şu örneğe bir bakalım:

>>> meyve = "elma"

>>> list(meyve)

['e', 'l', 'm', 'a']

Gördüğünüz gibi, bu list() fonksiyonunu kullanarak karakter dizisi içindeki karakterlerden bir liste oluşturabiliyoruz. Diyelim ki elinizde birkaç tane karakter dizisi var ve siz bunları bir liste haline getirmek istiyorsunuz. Böyle bir durumda bu fonksiyon işinize yarayabilir:

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

a = "elma"
b = "armut"
c = "kiraz"

print list((a, b, c))

list() fonksiyonunda parantez içine sadece tek bir öğe yazabiliriz. Eğer birden fazla öğe kullanmak istiyorsanız bu öğeleri ayrı bir parantez içinde belirtmeniz gerekir. Böylece Python bu öğeleri tek bir öğeymiş gibi algılayacak ve size istediğiniz çıktıyı verecektir.

Böylece Python’da bir listenin nasıl oluşturulacağını öğrenmiş olduk. Şimdi isterseniz Python listelerini biraz daha ayrıntılı bir şekilde inceleyelim.

Liste Öğelerine Erişmek

Yukarıdaki örneklerden de gördüğümüz gibi Python’daki listeler tıpkı birer değişken gibi tanımlanıyor:

>>> liste = []

Bir liste içine öğe eklemek istediğimiz zaman, öğeleri birbirinden virgül ile ayırıyoruz:

>>> spor = ["futbol", "basketbol", "tenis", "golf"]

Peki bir listedeki öğe sayısını nasıl öğrenebiliriz? Elbette elle sayarak değil... Mesela şu listedeki öğe sayısını elle sayarak bulmak bir Python programcısına hiç yakışmaz:

>>> dagitimlar = ["Ubuntu", "Debian", "Fedora", "Arch", "Gentoo", "SuSe",
... "Pardus", "RedHat", "Truva", "Gelecek", "Mint", "Mandriva", "PCLinuxOs",
... "Sabayon", "Mepis", "Puppy", "Slackware", "CentOS", "Knoppix", "Zenwalk",
... "Sidux", "Elive", "Nexenta", "GNewSense", "Ututo", "Vector"]

Tanımladığımız bir listenin öğe sayısını, bir önceki bölümde öğrendiğimiz len() fonksiyonu yardımıyla elde edebiliriz:

>>> len(dagitimlar)

26

Demek ki listemiz 26 öğeden oluşuyormuş. Bu arada uzun bir listeyi nasıl böldüğümüze ve alt satıra geçtiğimize dikkat edin.

Bu listeyi ekrana yazdırmak için şöyle bir şey yapmamız gerektiğini de biliyoruz:

>>> print dagitimlar

['Ubuntu', 'Debian', 'Fedora', 'Arch', 'Gentoo', 'SuSe', 'Pardus', 'RedHat',
'Truva', 'Gelecek', 'Mint', 'Mandriva', 'PCLinuxOs', 'Sabayon', 'Mepis',
'Puppy', 'Slackware', 'CentOS', 'Knoppix', 'Zenwalk', 'Sidux', 'Elive',
'Nexenta', 'GNewSense', 'Ututo', 'Vector']

Bu şekilde listenin bütün öğelerini ekrana döktük. Peki ya biz bu 26 öğeli listenin bütün öğelerini değil de, mesela sadece birinci öğesini almak istersek ne yapacağız?

Bunun için şöyle bir yöntemimiz var:

>>> print dagitimlar[1]

Debian

Gördüğünüz gibi, formülümüz şöyle:

>>> liste_adı[öğe_sırası]

Yalnız burada dikkat ettiyseniz print dagitimlar[1] komutu Debian çıktısı verdi. Halbuki listenin ilk öğesi Ubuntu. Bu durum Python listelerinin çok önemli bir özelliğidir. Python’da liste öğeleri 0’dan başlar. Yani bir listenin ilk öğesinin sırası her zaman 0’dır. Dolayısıyla yukarıdaki listede Ubuntu öğesini elde etmek istiyorsak şu komutu yazmalıyız:

>>> print dagitimlar[0]

Ubuntu

Bu yöntem bize çok daha ilginç şeyler yapma imkanı da verir. Mesela bu yöntemi kullanarak bir listenin belli bir aralıktaki öğelerini alabiliriz:

>>> liste = ["Hale", "Jale", "Lale", "Ahmet", "Mehmet", "Kezban"]

>>> print liste[0:2]

['Hale', 'Jale']

Gördüğünüz gibi, bu şekilde listenin birinci ve ikinci öğelerini ayrı bir liste olarak alabiliyoruz. Eğer alacağınız ilk öğenin sırası 0 ise yukarıdaki komutu şöyle de yazabilirsiniz:

>>> print liste[:2]

Eğer iki nokta üst üste işaretinin sol tarafındaki sayıyı yazmazsanız Python oraya 0 yazmışsınız gibi davranacaktır. Elimiz alışsın diye birkaç örnek yapalım bununla ilgili:

>>> print liste[2:5]

['Lale', 'Ahmet', 'Mehmet']

>>> print liste[2:6]

['Lale', 'Ahmet', 'Mehmet', 'Kezban']

Son örnekte alacağımız son öğe listenin de son öğesi. O yüzden o komutu şöyle de yazabiliriz:

>>> print liste[2:]

['Lale', 'Ahmet', 'Mehmet', 'Kezban']

Eğer iki nokta üst üste işaretinin sağındaki sayıyı yazmazsak Python oraya listenin son öğesinin sırasını yazmışız gibi davranacaktır.

Eğer 0’dan başlayarak bir listenin bütün öğelerini almak istersek de şöyle bir şey yazabiliriz:

>>> print liste[:]

['Hale', 'Jale', 'Lale', 'Ahmet', 'Mehmet', 'Kezban']

Bu yöntem, bir listeyi tamamen kopyalamanın iyi bir yoludur:

>>> liste2 = liste[:]

>>> print liste2

['Hale', 'Jale', 'Lale', 'Ahmet', 'Mehmet', 'Kezban']

>>> print liste

['Hale', 'Jale', 'Lale', 'Ahmet', 'Mehmet', 'Kezban']

Gördüğünüz gibi, aynı öğelere sahip iki farklı liste oluşturduk. Yalnız bu iki listenin birbirinden farklı olduğunu unutmayın. Yani bir liste üzerinde yaptığınız değişiklik öteki listeyi etkilemeyecektir.

Listelere yukarıdaki gibi erişirken üçüncü bir sayı daha verebiliriz:

>>> liste[0:6:2]

['Hale', 'Lale', 'Mehmet']

Gördüğünüz gibi, üçüncü sayı liste öğelerinin kaçar kaçar atlanarak ekrana basılacağını gösteriyor. Burada 0’dan başlayarak 6. sıraya kadar olan öğeleri ikişer ikişer atlayarak ekrana bastık.

Yukarıdaki komutu şöyle de yazabilirdik:

>>> liste[::2]

['Hale', 'Lale', 'Mehmet']

Üçüncü sayı eksi değerli de olabilir. O zaman liste öğeleri geriye doğru sıralanacaktır:

>>> liste[::-2]

['Kezban', 'Ahmet', 'Jale']

Bütün öğeleri tersten sıralamak istersek şöyle bir şey yazabiliriz:

>>> liste[::-1]

['Kezban', 'Mehmet', 'Ahmet', 'Lale', 'Jale', 'Hale']

Python’da liste oluşturmayı ve bu listenin öğelerine erişmeyi öğrendiğimize göre şimdi listeleri yönetmeyi; yani listeye öğe ekleme, listeden öğe çıkarma gibi işlemleri nasıl yapacağımızı öğrenebiliriz. Bu işi Python’da bazı parçacıklar (ya da daha teknik bir dille söylemek gerekirse “metotlar”...) yardımıyla yapıyoruz. İsterseniz gelin şimdi bu metotların neler olduğuna ve nasıl kullanıldıklarına bakalım.

Liste Metotları

Dediğimiz gibi, Python’daki listeleri yönetebilmek için “metot” denen bazı araçlardan yararlanmamız gerekiyor. Peki nedir bu metot denen şey?

Metotlar, Python’da bir veri tipinin özelliklerini değiştirmemizi veya sorgulamamızı sağlayan oldukça yetenekli parçacıklardır. Listelerle birlikte hangi metotları kullanabileceğimizi öğrenmek için dir() adlı bir fonksiyondan yararlanabiliriz. Bu fonksiyonu listeler üzerine şu şekilde uyguluyoruz:

>>> liste = []

>>> dir(liste)

Dilerseniz boş bir liste tanımlamakla hiç uğraşmadan, listelerin ayırt edici özelliği olan köşeli parantezleri de kullanabilirsiniz:

>>> dir([])

Hatta listelerin Python’daki adı olan list kelimesini dahi kullanabilirsiniz:

>>> dir(list)

Tercih tamamen size kalmış...

Bu komutlardan herhangi birini verdiğimizde şöyle bir cevap alırız:

['__add__', '__class__', '__contains__', '__delattr__', '__delitem__',
'__delslice__', '__doc__', '__eq__', '__format__', '__ge__',
'__getattribute__', '__getitem__', '__getslice__', '__gt__', '__hash__',
'__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__',
'__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
'__reversed__', '__rmul__', '__setattr__', '__setitem__', '__setslice__',
'__sizeof__', '__str__', '__subclasshook__', 'append', 'count', 'extend',
'index', 'insert', 'pop', 'remove', 'reverse', 'sort'
]

İşte bu gördüğümüz çıktıdaki öğeler listelerin metotları oluyor. Burada bizi ilgilendiren metotlar başında ve sonunda “__” işaretini taşımayanlar. Yani şunlar:

append
count
extend
index
insert
pop
remove
reverse
sort

Biz bu bölümde bu metotları işlevlerine göre gruplayarak inceleyeceğiz. İsterseniz hemen yola koyulalım.

Listeye Öğe Eklemek

Python’da herhangi bir listeye öğe eklemek için append() metodundan yararlanabiliriz. append kelimesi Türkçe’de “eklemek” anlamına gelir. Bu metodun yaptığı şey de tam olarak budur zaten.

Öncelikle bir liste oluşturalım:

>>> programlama_dilleri = ["Python", "Ruby", "Perl"]

Böylece elimizde programlama_dilleri adlı bir liste olmuş oldu. Şimdi bu listeye C++ öğesini ekleyelim:

>>> programlama_dilleri.append("C++")

Şimdi listeyi ekrana yazdırdığımızda öğeler arasında C++‘ı da göreceğiz:

>>> print programlama_dilleri

['Python', 'Ruby', 'Perl', 'C++']

Burada append() metodunu nasıl kullandığımıza dikkat edin. Formülümüz şöyle:

liste_adı.metot()

Alıştırma olması için bir örnek daha yapalım:

>>> alisveris_listesi = []

>>> alisveris_listesi.append("soğan")

>>> print alisveris_listesi

['so\xa7an']

Gördüğünüz gibi, append() metoduyla boş bir listeye de öğe ekleyebiliyoruz.

Burada dikkatimizi çeken başka bir şey daha var. Listeyi ekrana yazdırdığımızda Türkçe karakter içeren soğan öğesi düzgün görünmüyor. Bu durum normal. Python liste çıktılarında Türkçe karakterleri gösteremez. Ama liste içindeki Türkçe karakterli öğeleri düzgün göstermenin bir yolu var:

>>> for oge in alisveris_listesi:
...     print oge
...
soğan

for döngüsünden yararlanarak liste öğelerini tek tek ekrana dökebiliriz. Bu sırada da Türkçe karakterler, olması gerektiği gibi görünecektir. Bir örnek daha yapalım:

>>> alisveris_listesi = ["soğan", "sarımsak", "çilek", "üzüm"]

>>> print alisveris_listesi

['so\xa7an', 'sar\x8dmsak', '\x87ilek', '\x81z\x81m']

>>> for i in alisveris_listesi:
...     print i
...
soğan
sarımsak
çilek
üzüm

Gördüğünüz gibi Python’da çareler tükenmiyor.

append() metodunu kullanarak bir listeye tek tek öğe ekleyebiliyoruz. Peki aynı metodu kullanarak listeye birden fazla öğe ekleyebilir miyiz? Deneyelim:

>>> iller = []

>>> iller.append("Adana", "Mersin")

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: append() takes exactly one argument (2 given)

Burada Python bize bir hata mesajı verir, çünkü append() metodu yalnızca tek bir öğe kabul eder. Biz burada iki öğe vermişiz...

Demek ki bu metodu kullanarak bir listeye sadece tek bir öğe ekleyebiliyoruz. append() metodu ile şöyle bir şey yapabilirsiniz, ancak istediğiniz tam olarak bu olmayabilir:

>>> iller.append(["Adana", "Mersin"])

Burada append() metodu içinde bir liste oluşturduk ([“Adana”, “Mersin”]) ve doğrudan bu listeyi iller adlı listeye ekledik. Şimdi şuna bakalım:

>>> print iller

[['Adana', 'Mersin']]

Burada iç içe geçmiş iki tane liste görüyoruz. Demek ki yukarıdaki şekilde öğe eklediğimizde Python bunu yine tek bir öğe olarak ekliyor. O yüzden her zaman istediğiniz şey bu olmayabilir. Peki bir listeye birden fazla öğe eklemek istersek elimizde hiç bir imkan yok mu? Elbette var. Mesela for döngülerinden yararlanabilirsiniz:

>>> lst = ["Adana", "Mersin"]

>>> iller = []

>>> for i in lst:
...     iller.append(i)

>>> print iller

['Adana', 'Mersin']

Böylece istediğimizi elde etmiş olduk. Ama Python bize aynı şeyi çok daha temiz bir şekilde yapma imkanı da sağlar. Bunun için başka bir metottan yararlanacağız. O metodun adı extend.

Yukarıdaki örneği extend metodunu kullanarak yazalım:

>>> iller = []

>>> iller.extend(["Adana", "Mersin"])

>>> print iller

['Adana', 'Mersin']

extend kelimesi Türkçe’de “genişletmek, uzatmak” gibi anlamlara gelir. Bu metot, anlamına uygun olarak bir listeyi başka bir liste ile genişletir... Yani bir listenin öğelerini başka bir listeye tek tek ekler.

extend metodunu kullanarak bir listeye tek bir öğe ekleyemezsiniz. Daha doğrusu aldığınız sonuç beklediğiniz gibi olmayabilir. Mesela:

>>> os = ["Windows", "Mac"]

>>> os.extend("GNU/Linux")

>>> print os

['Windows', 'Mac', 'G', 'N', 'U', '/', 'L', 'i', 'n', 'u', 'x']

Gördüğünüz gibi, extend metodu “GNU/Linux” içindeki her bir karakteri tek tek listeye ekledi. Aynı etkiyi append() metodu ile elde etmek istersek yine for döngüsünden yararlanabiliriz:

>>> os = ["Windows", "Mac"]

>>> for harf in "GNU/Linux":
...     os.append(harf)

>>> print os

['Windows', 'Mac', 'G', 'N', 'U', '/', 'L', 'i', 'n', 'u', 'x']

Dikkat ederseniz hem append(), hem de extend() metotları öğeyi hep listenin en sonuna ekliyor. Ama biz yazdığımız programlarda bazen öğeyi belli bir sıraya yerleştirmek isteyebiliriz. İşte bunun için kullanabileceğimiz başka bir metot daha var Python’da: insert() metodu.

Kelime olarak insert, Türkçe’de “yerleştirmek, sokmak” gibi anlamlara gelir. Bu metodu kullanarak bir öğeyi bir listenin belli bir sırasına yerleştireceğiz. Örneğin:

>>> lst = ["Ahmet", "Mehmet", "Salih"]

>>> lst.insert(0, "Ali")

>>> print lst

['Ali', 'Ahmet', 'Mehmet', 'Salih']

Burada insert() metodunu nasıl kullandığımıza dikkat edin. Metodun parantezi içindeki ilk sayı, yeni öğenin yerleştirileceği konumu gösteriyor. İkinci öğenin ne olduğu ise belli. Burada biz listenin sıfırıncı, yani ilk sırasına Ali adlı bir öğe yerleştirdik.

Listeden Öğe Silmek

Bir önceki bölümde gördüğümüz metotlar yardımıyla listeye öğe ekleyebiliyoruz. Peki ya listeden öğe silmek istersek ne yapacağız?

Bu işlem için de bazı metotlarımız var. Mesela remove() metodu.

>>> mevsimler = ["İlkbahar", "Yaz", "Sonbahar", "Kış"]

>>> mevsimler.remove("İlkbahar")

>>> print mevsimler

['Yaz', 'Sonbahar', 'K\x8d\x9f']

Gördüğünüz gibi, remove() metodunu kullanarak liste içindeki istediğimiz bir öğeyi listeden çıkarabiliyoruz. Burada öğeyi listeden çıkarabilmek için öğenin adını yazmamız gerekti. Peki ya biz öğeyi adına göre değil de listedeki sırasına göre çıkarmak istersek ne yapacağız? Yani mesela listedeki 1. öğeyi çıkarmak istiyoruz diyelim...

del adlı özel bir deyimi kullanarak bu amacımızı gerçekleştirebiliriz:

>>> del mevsimler[0]

Bu komut, mevsimler adlı listenin ilk öğesini siler. Aynı deyimle listenin tamamını da silebilirsiniz:

>>> del mevsimler

Böylece mevsimler adlı listeyi tamamen silmiş olduk:

>>> print mevsimler

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'mevsimler' is not defined

remove() metodu ve del deyimi dışında, listelerden öğe silmenin bir başka yolu daha vardır: pop() metodu.

>>> gunler = ["Pazartesi", "Salı", "Çarşamba", "Perşembe",
... "Cuma", "Cumartesi", "Pazar"]

>>> gunler.pop()

'Pazar'

pop() metodunun öteki metotlardan farkı, sildiği öğeyi bir de ekrana basmasıdır. Bu metot bir listedeki en son öğeyi siler ve ekrana basar. İsterseniz bu metodun kaçıncı sıradaki öğeyi sileceğini belirleyebilirsiniz:

>>> gunler.pop(0)

'Pazartesi'

Bu komut listedeki 0. öğeyi silip ekrana basacaktır.

Liste Öğelerini Sıralamak

Python’da liste öğelerini iki şekilde sıralayabiliriz: Birincisi, liste öğelerini ters çevirebiliriz. İkincisi, liste öğelerini alfabe sırasına dizebiliriz.

Liste öğelerini ters çevirmek için reverse() adlı bir metottan yararlanacağız:

>>> sayilar = range(10)

>>> print sayilar

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

>>> sayilar.reverse()

>>> print sayilar

[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

Liste öğelerini alfabe sırasına dizmek için ise sort() adlı bir metottan yararlanacağız:

>>> isimler = ["Ahmet", "Mehmet", "Selami", "Doruk", "Ege"]

>>> isimler.sort()

>>> print isimler

['Ahmet', 'Doruk', 'Ege', 'Mehmet', 'Selami']

Gördüğünüz gibi liste içindeki isimler alfabe sırasına dizildi. Yalnız bu metot Türkçe karakter içeren kelimelerde sorun yaratabilir:

>>> isimler = ["Kürşat", "Ökkeş", "Çetin", "Fırat"]

>>> isimler.sort()

>>> print isimler

['F\x8drat', 'K\x81r\x9fat', '\x80etin', '\x99kke\x9f']

İsimlerde Türkçe karakter olduğu için alfabe sırasına dizme işlemi başarısız oldu.

Bu sorunun üstesinden gelmek için şöyle bir kod yazabilirsiniz:

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

import locale
locale.setlocale(locale.LC_ALL, "")

isimler = ["Kürşat", "Ökkeş", "Çetin", "Fırat"]

isimler.sort(key = locale.strxfrm)

for i in isimler:
    print i

Bu kodlardaki pek çok şeyi henüz öğrenmedik. Benim amacım sadece sort() metoduyla Türkçe karakter içeren kelimelerin de alfabe sırasına dizilebileceğini göstermek. Yukarıdaki kodlarda gördüğümüz her şeyi birkaç bölüm sonra öğrenmiş olacağız.

Liste Öğelerinin Sırasını Bulmak

Python’da bir liste içindeki öğelerin sırasını bulmak için index() adlı bir metottan yararlanıyoruz. Bu metot bir öğenin liste içinde hangi sırada yer aldığını bildirir:

>>> lst = ["erik", "çilek", "karpuz", "kavun"]

>>> lst.index("çilek")

1

Eğer bir liste içinde aynı öğeden birden fazla sayıda varsa, bu metot yalnızca ilk rastladığı öğeyi bulacaktır. Mesela:

>>> meyveler = ["elma", "erik", "elma", "çilek",
... "karpuz", "kavun", "su", "elma"]

>>> meyveler.index("elma")

0

Gördüğünüz gibi, elma öğesi liste içinde birkaç farklı konumda geçtiği halde index() metodu yalnızca 0. konumdaki öğeyi buldu. Ancak bu metodun liste içinde geçen aynı öğelerin tamamını bulmasını sağlamak da mümkün. Peki ama nasıl?

index() metodu, parantez içinde ikinci bir değer daha alır. Şu örneğe bakalım:

>>> meyveler = ["elma", "erik", "elma", "çilek",
... "karpuz", "kavun", "su", "elma"]

>>> meyveler.index("elma")

0

>>> meyveler.index("elma", 1)

2

>>> meyveler.index("elma", 2)

2

>>> meyveler.index("elma", 3)

7

Burada parantez içine yazdığımız ikinci değer, index() metodunun, bir öğeyi liste içinde hangi konumdan itibaren aramaya başlayacağını gösteriyor. Bunun öntanımlı değeri 0’dır. Yani eğer parantez içindeki ikinci değeri belirtmezseniz, Python siz oraya 0 yazmışsınız gibi davranacak ve aramaya 0. sırada başlayacaktır. Eğer bu değer 1 yaparsanız Python listeyi taramaya 1. öğeden başlayacak ve böylece, 0. sırayı atladığı için 2. sırada yer alan elma öğesini bulabilecektir. Eğer bu değeri 3 yaparsak, Python bu kez listeyi taramaya 3. sıradan başlayacak ve böylece, 0. ve 2. sıradaki öğeleri atladığı için 7. sıradaki elma öğesini bulabilecektir.

Bu bilgiyi kullanarak, bir liste içindeki öğelerin hangi konumlarda yer aldığını gösteren bir program yazabiliriz:

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

#meyve listesini tanımlayalım...
meyveler = ["elma", "erik", "elma", "çilek",
            "karpuz", "kavun", "su", "elma"]

#Bu sayı index() metodunun parantezi içindeki
#ikinci değer olacak. Bu değeri bir while
#döngüsü içinde birer birer arttıracağız.
sira = 0

#Bu liste, aranan öğenin listede bulunduğu
#konumları tutuyor.
liste = []

#while döngümüzü yazıyoruz.
while sira < len(meyveler):
    #Bu try... except... bloğunun görevini anlamak
    #için "elma" yerine başka bir öğe koyun ve try...
    #except... bloklarını kaldırın.
    try:
        oge = meyveler.index("elma", sira)
    except ValueError:
        pass

    #sıra değişkeninin değerini birer birer
    #arttırıyoruz. Böylece index() metodu listenin
    #her noktasını tarayabiliyor.
    sira += 1

    #Burada amacımız aynı sayının listeye eklenmesini
    #engellemek. Bunu tam olarak ne işe yaradığını
    #anlamak için de "if not oge in liste:" satırını
    #kaldırmayı deneyebilirsiniz.
    if not oge in liste:
        liste.append(oge)

#listedeki değerleri bir karakter dizisi içine
#alıp ekrana basıyoruz.
for nmr in liste:
    print "aranan öğe %s konumunda bulundu!"%nmr

Liste Öğelerinin Sayısını Bulmak

Python’da bir liste içindeki öğelerin sayısını bulmak için count() adlı bir metottan yararlanıyoruz. Bu metot bir öğenin liste içinde kaç kez geçtiğini bildirir:

>>> lst = ["erik", "çilek", "karpuz", "erik", "kavun", "karpuz", "çilek"]

>>> lst.count("erik")

2

sum() Fonksiyonu

Diyelim ki kullanıcıdan aldığı sayıları birbiriyle toplayan bir program yazmak istiyorsunuz. Bunun için şöyle bir şey yapabilirsiniz:

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

a = 0

print """
Toplama işlemi için sayı girin:
(Programdan çıkmak için 'q' tuşuna basın)
"""

while True:
    sayi = raw_input("sayı: ")
    if sayi == "q":
        print "hoşçakalın!"
        break

    else:
        a += int(sayi)

    print "girdiğiniz sayıların toplamı: ", a

Bu programın mantığı şudur: Öncelikle a adlı bir değişken oluşturuyoruz. Bu değişkenin değeri bir sayıdır. Kullanıcının girdiği her sayı bu değişkenin mevcut değeriyle toplandıktan sonra yine bu değişkene atanacak. Böylece kullanıcının girdiği bütün sayıların toplam değeri bu a değişkeninin de değeri olacak. Dolayısıyla kullanıcının girdiği sayıların toplamını bulmak için programın sonunda a değişkenini ekrana yazdırmamız yeterli olacaktır.

Kullanıcının programı sona erdirebilmesi için “q” tuşunu belirliyoruz. Eğer kullanıcı sayı girmek yerine bu tuşa basarsa program sona erecektir. Ayrıca else bloğu içinde, kullanıcıdan aldığımız sayıyı int’e, yani tamsayıya dönüştürdüğümüze dikkat edin.

Yukarıdakine benzer bir işlemi Python’da özel bir fonksiyon olan sum() yardımıyla da gerçekleştirebiliriz. Bu fonksiyon, bir dizi içindeki sayıların birbiriyle kolayca toplanmasını sağlar. Bununla ilgili bir örnek şöyle olabilir:

>>> sayilar = [2, 3, 4]

>>> print sum(sayilar)

9

veya:

>>> print sum([2, 3, 4])

9

Gördüğünüz gibi, sum() fonksiyonu, kendisine verilen bir dizi sayıyı alıp bu sayıları birbiriyle topluyor. Dilerseniz bu bölümün başında verdiğimiz örneği sum() fonksiyonunu kullanarak tekrar yazalım:

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

sayilar = []

print """
Toplama işlemi için sayı girin:
(Programdan çıkmak için 'q' tuşuna basın)
"""

while True:
    sayi = raw_input("sayı: ")
    if sayi == "q":
        print "hoşçakalın!"
        break

    else:
        sayilar.append(int(sayi))

    print "girdiğiniz sayıların toplamı: ", sum(sayilar)

Bu defa öncelikle sayilar adlı bir liste oluşturduk. Kullanıcıdan gelen sayıları bu listede tutacağız. Kullanıcıdan gelen sayıları bu listeye eklemek için append() metodundan yararlandığımıza dikkat edin. sayilar adlı liste içinde biriken sayıları toplamak için de sum() fonksiyonundan yararlandık.

enumerate() Fonksiyonu

Hatırlarsanız, dir() adlı bir fonksiyon yardımıyla liste metotlarını topluca ekrana yazdırabileceğimizi öğrenmiştik:

>>> dir(list)

Eğer burada toplam kaç metot olduğunu öğrenmek istersek len() fonksiyonu işimizi görüyor:

>>> len(dir(list))

45

Peki ya dir(list) çıktısında görünen metotları numaralandırmak istersek ne yapacağız?

İşte bunun için enumerate() adlı bir fonksiyonumuz var. Bakalım bu fonksiyonu nasıl kullanıyoruz:

>>> liste = dir(list)

>>> for i in enumerate(liste):
...     print i
...
(0, '__add__')
(1, '__class__')
(2, '__contains__')
(3, '__delattr__')
(4, '__delitem__')
(5, '__delslice__')
(6, '__doc__')
(7, '__eq__')
(8, '__format__')
(9, '__ge__')

Biz burada çıktının tamamını göstermiyoruz, ancak gördüğünüz gibi, dir(list) komutunun verdiği bütün çıktılar (sıra_no, ‘metot_adı’) şeklinde ekrana dökülüyor. Şimdi şuna bakın:

>>> for sira_no, metot_adi in enumerate(liste):
...     print "%s. %s" %(sira_no, metot_adi)
...
0. __add__
1. __class__
2. __contains__
3. __delattr__
4. __delitem__
5. __delslice__
6. __doc__
7. __eq__
8. __format__
9. __ge__

Bu kodlarla çıktıyı nasıl istediğimiz kıvama getirdiğimizi görüyorsunuz. Burada for sira_no, metot_adi in enumerate(liste): satırına özellikle dikkat edin. Bir önceki örnekte enumerate(liste) içeriğinin (sira_no, 'metot_adi') şeklinde olduğunu görmüştük. İşte biz for sira_no, metot_adi satırı ile, çıktıdaki sıra numaralarını sira_no adlı değişkene, metot adlarını ise metot_adi adlı değişkene atıyoruz. Yukarıdaki kodu şöyle yazacak olursanız durum daha da netleşecektir:

>>> for sira_no, metot_adi in enumerate(liste):
...     print sira_no
...
0
1
2
3
4
5
6
7
8
9

>>> for sira_no, metot_adi in enumerate(liste):
...     print metot_adi
...
__add__
__class__
__contains__
__delattr__
__delitem__
__delslice__
__doc__
__eq__
__format__
__ge__

Gördüğünüz gibi, sira_no değişkeni sıra numaralarını, metot_adi değişkeni ise metot adlarını tutuyor. Yukarıda print "%s. %s" %(sira_no, metot_adi) satırıyla yaptığımız şey ise enumerate() fonksiyonundan gelen bu sıra numaralarını ve metot adlarını “%s” işaretlerini kullanarak düzgün bir şekilde biçimlendirmekten ibarettir.

Bu arada dikkat ederseniz enumerate() ile verdiğimiz numaralar sıfırdan başlıyor. Eğer ilk sayının 0 yerine 1 olmasını isterseniz yukarıdaki kodu şöyle yazabilirsiniz:

>>> for sira_no, metot_adi in enumerate(liste, 1):
...     print "%s. %s" %(sira_no, metot_adi)

Burada 1 yerine istediğiniz sayıyı yerleştirerek, sıralamaya istediğiniz sayıdan başlanmasını sağlayabilirsiniz.

in Deyimi

Aslında biz bu in deyimini biliyoruz. Biz bu deyimi for döngüsüyle birlikte kullanıyorduk. Mesela:

>>> for i in range(10):
...     print i

in deyimi bir ifadeye temel olarak “-de/-da, içinde” anlamı katar. Bu deyimi kullanarak bir şeyin başka bir şeyin içinde olup olmadığını sorgulayabiliriz:

>>> liste = ["elma", "armut", "çilek", "erik", "muz"]

>>> "elma" in liste

True

Burada tam olarak şöyle dedik: “liste içinde ‘elma’ var mı?

elma öğesi liste içinde bulunduğu için Python bize True cevabını verdi. Bir de şuna bakalım:

>>> "karpuz" in liste

False

Liste içinde “karpuz” diye bir öğe olmadığı için Python bize False cevabı verdi...

Gelin isterseniz bununla ilgili şöyle bir örnek verelim:

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

turkce_harfler = "ışğçüöİŞĞÇÜÖ"
kontrol_listesi = []

dosya = raw_input("Dosya için bir ad seçin: ")

for hrf in dosya:
    if hrf in turkce_harfler:
        kontrol_listesi.append(hrf)

if kontrol_listesi:
    print "Dosya adında Türkçe harf olmamalı!"

elif len(dosya) > 8:
    print "Dosya adı en fazla 8 karakter içerebilir!"

else:
    print "Dosya '%s' adıyla kaydedildi!" %dosya

Burada yaptığımız şey aslında çok basit. Önce Türkçe harflerin tanımlandığı bir liste oluşturuyoruz. Daha sonra kullanıcıdan gelen dosya adına bakıp bunun içinde Türkçe karakter olup olmadığını denetliyoruz. Eğer dosya adında Türkçe karakter varsa bunları kontrol listesine ekliyoruz. Eğer kontrol listesinde en az bir tane öğe varsa dosya adı Türkçe karakter içeriyor demektir.

min() ve max() Fonksiyonları

Bir sayı dizisi içinde yer alan sayıların en büyüğünü veya en küçüğünü öğrenmeniz gerekirse ne yaparsınız? Elbette min() ve max() fonksiyonlarından yararlanırsınız.

>>> lst = [45, 24, 98, 71, 43, 94, 35, 90, 66, 39, 97, 96, 66, 26, 34, 61,
... 80, 77, 30, 92, 88, 59, 64, 50, 27, 63, 77, 48, 28, 52, 78, 56, 61, 52,
... 35, 41, 53, 75, 93, 97, 58, 75, 73, 57, 73, 73, 46, 74, 31, 40, 100,
... 94, 73, 40, 25, 64, 96, 27, 33, 77, 62, 97, 25, 76, 33, 42, 99, 33, 54,
... 39, 99, 62, 99, 72, 90, 62, 78, 39, 92, 42, 58, 50, 41, 73, 27, 54, 37,
... 75, 34, 63, 80, 100, 83, 32, 65, 49, 82, 64, 42, 30]

>>> min(lst) #listedeki en küçük sayı

24

>>> max(lst) #listedeki en büyük sayı

100

Bölüm Soruları

1. Şu örnekte, kullanıcıdan aldığımız karakter dizisini neden int(raw_input("sayı: ")) şeklinde en başta değil de else bloğu içinde sayıya dönüştürmeyi tercih ettiğimizi açıklayın.

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

a = 0

print """
Toplama işlemi için sayı girin:
(Programdan çıkmak için 'q' tuşuna basın)
"""

while True:
    sayi = raw_input("sayı: ")
    if sayi == "q":
        print "hoşçakalın!"
        break

    else:
        a += int(sayi)

    print "girdiğiniz sayıların toplamı: ", a

2. http://wiki.ubuntu-tr.net/index.php/Ubuntu’da_S%C3%BCr%C3%BCm_%C4%B0simleri_ve_Anlamlar%C4%B1 adresinde bulunan Ubuntu sürüm isimlerini bir liste haline getirin ve ekrana şuna benzer bir çıktı verin:

1) Warty Warthog
2) Hoary Hedgehog
...

3. Bir program yazarak kullanıcıdan 10 adet sayı girmesini isteyin. Kullanıcının aynı sayıyı birden fazla girmesine izin vermeyin. Programın sonunda, kullanıcının girdiği sayıları tek ve çift sayılar olarak ikiye ayırın ve her bir sayı grubunu ayrı ayrı ekrana basın.

4. Aşağıdaki programı, liste öğesini kullanıcıdan alacak şekilde yeniden yazın. Eğer kullanıcının aradığı öğe listede yoksa kendisine bir uyarı mesajı gösterin ve başka bir öğe arayabilme şansı verin:

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

meyveler = ["elma", "erik", "elma", "çilek",
            "karpuz", "kavun", "su", "elma"]

sira = 0
liste = []
while sira < len(meyveler):
    try:
        oge = meyveler.index("elma", sira)
    except ValueError:
        pass
    sira += 1
    if not oge in liste:
        liste.append(oge)

for nmr in liste:
    print "aranan öğe %s konumunda bulundu!"%nmr

5. Liste metotları içinde sadece bizi ilgilendiren şu metotları ekrana döken bir program yazın:

append
count
extend
index
insert
pop
remove
reverse
sort