= [3,4,5,6,7,8]
L 0] # birinci eleman L[
3
Kaan Öztürk
January 26, 2018
Daha önceki bir bölümde Python’daki liste, çokuz, dize ve sözlük tiplerinin nasıl kullanıldığını kısaca özetlemiştik. Bu ve bunu izleyen üç yazıda liste, sözlük, dize ve küme veri tiplerine dair daha fazla ayrıntı işleyeceğiz. Dizinin bütün yazılarına erişmek için Python Programlamaya Giriş kategorimize bakabilirsiniz. Bu dizideki yazılar ayrıca Jupyter defterleri halinde GitHub depomuzda da mevcut.
Bu yazının konusu sıralı nesne (sequential object) olarak anılan liste, çokuz ve dize tipleriyle ilgili bazı işlemlerdir. Bunlara sıralı nesne denmesinin sebebi, içlerinde barındırdıkları nesnelerin sırasının önemli oluşu. Söz gelişi, "merhaba"
dizesi ile "baharem"
dizesi farklıdır, aynı harfleri barındırmalarına rağmen. Buna karşılık bir sözlük sıralı nesne değildir, çünkü {"ahmet":123, "ayşe":456}
ile {"ayşe":456, "ahmet":123}
aynı sözlüğü tanımlarlar.
Bu yazıda göreceklerimiz: * Dilimleme (slicing) * Öntanımlı fonksiyonlar: range, len, del, list, tuple, join, all, any, enumerate, max, min, sorted, sum, zip
* Türkçe alfabeye göre sıralama
Daha önce, bir L
sıralı nesnesinin i
indeksli bir elemanına L[i]
işlemi ile ulaşabildiğimizi görmüştük. Python’da indeksler sıfırdan başladığı için L[i]
listenin i+1
’inci elemanını verir.
Bazen sonuncu, sondan ikinci vs. elemanları elde etmek isteriz. Genellikle listenin kaç elemanlı olduğunu tam olarak bilmediğimiz için bunu genel bir ifadeyle yazmamız gerekir. Bunun bir yolu, listenin kaç elemanlı olduğunu veren len
fonksiyonunu kullanmaktır.
Liste indeksleri sıfırdan başlayıp len(L)
-1 değerine kadar gider. O zaman sonuncu elemanı L[len(L)-1]
ile elde edebiliriz.
L = [3,4,5,6,7,8]
print( L[len(L)-1] ) # sonuncu eleman
print( L[len(L)-2] ) # sondan bir önceki eleman
8
7
Python bu zahmetli yazım yerine doğrudan negatif indeks kullanmaya izin verir. Negatif indeks kullanmak sondan itibaren saymak anlamına gelir. L[-i]
ifadesi, sondan i
’inci elemanı verir.
Dizinin belli bir alt kümesini almak için L[a:b]
ifadesini kullanırız. Bu dilimleme işlemi L[a]
elemanından L[b-1]
elemanına kadar bir alt dizi verir. Dikkat: Bu alt diziye L[b]
dahil değildir.
Dilimleme işleminde başlangıç indeksini vermezsek, ilk elemandan başlanır.
Bitiş indeksini vermezsek, son elemana kadar gider.
Bitiş indeksi olarak negatif bir sayı verirsek, o negatif sayıyla belirtilen indeksin bir öncesine kadar gider.
Ne başlangıç ne de bitiş indeksi verirsek dizinin aynısı geri verilir. Bu ilk başta faydasız görünse de, listenin bir kopyasını çıkarma amacıyla sık kullanılan bir kalıptır.
Dilimleme yaparken elemanları atlamamız da mümkündür.
Negatif adım vererek diziyi sondan başa tarayabiliriz.
Liste dilimlerine atama yaparak listeyi değiştirmemiz mümkün olur.
[3, -1, -2, -3, 7, 8]
Yukarıda gösterdiğimiz indeksleme ve dilimleme kuralları, sıralı nesne olan dize (string) ve çokuz (tuple) tiplerinde de aynen geçerlidir.
Tek fark, dize ve çokuzlar değiştirilemez (immutable) veri tipleri oldukları için elemanlarında dilimleme ile değişiklik yapılamaz.
Eğer amacımız ortadaki bazı elemanları değiştirilmiş olan bir çokuz elde etmekse, bunu dilimleri birleştirerek sağlayabiliriz.
Aynı yöntem tabii dizelerde de geçerli olur.
Python’un öntanımlı fonksiyonlarının bir kısmı sıralı nesneler üretmekte veya sıralı nesneler hakkında bilgi edinmekte kullanılırlar. Bunların en yaygınlarının nasıl kullanıldığına bakalım şimdi. Python’daki öntanımlı fonksiyonların tam listesini Python belgelerinde bulabilirsiniz.
Tamsayılardan oluşan bir liste üretmek için range(baş, son, adım)
işlemini kullanabilirsiniz. Aslında range
bir fonksiyon değil, bir veri tipi döndürür. Onu bir listeye çevirmek için ayrıca list
işlemi gerekir.
range
işlemi bir liste değil, dizinin başlangıç, bitiş ve adım bilgilerini barındıran bir nesne geri verir sadece. Bu sayede, range(1000000)
gibi çok uzun görünen bir dizi bile bellekte ancak range(10)
kadar yer kaplar. Elemanlar ve alt aralıklar gerektiğinde aritmetik olarak hesaplanır.
Bir range
nesnesi for
döngüsünde doğrudan kullanılabilir.
Kapsayıcı bir nesnenin kaç nesne barındırdığını verir. Sıralı olmayan tiplerle de kullanılabilir.
Genel olarak, belli bir isme bağlı bir nesneyi bellekten kaldırır. Sıralı nesnelerde, bir dilimi silmek için de kullanılabilir.
list
fonksiyonu herhangi bir sıralı nesneyi bir liste nesnesine4 çevirmek için kullanılır.
tuple
fonksiyonu ise bir sıralı diziyi çokuza çevirir.
Bir dizenin harflerinden oluşan bir liste veya çokuz oluşturmak kolay olsa da, bunun tersi, yani harf listesini dizeye çevirmek için tek bir komut yok. Bu işlem için kabul edilen kalıp, dizelerin join
metodunu kullanmaktır (bir metod, bir nesnenin içinde tanımlanmış bir fonksiyondur).
Genel olarak s.join(L)
işlemi L
listesinin her elemanını aralarına s
dizesini koyarak birleştirir. Yukarıdaki örnekte s
bir boş dizeydi, o yüzden L
’nin elemanları yanyana yazıldı. Eğer istersek, araya başka karakterler de koyabiliriz.
Dize birleştirmeyi aşağıdaki gibi bir for
döngüsüyle de yapabiliriz.
Bir sıralı nesne içindeki bütün elemanlar mantıksal doğruya denkse True
verir, yoksa False
verir. Python’da sıfır, boş liste []
, boş dize ""
gibi yapıların da False
sayıldığını; sıfır olmayan sayıların ve boş olmayan nesnelerin de True
sayıldığını hatırlayın.
Bir liste içinde en az bir eleman mantıksal doğruya denkse True
verir, yoksa False
verir. Python’da sıfır, boş liste []
, boş dize ""
gibi yapıların da False
sayıldığını; sıfır olmayan sayıların ve boş olmayan nesnelerin de True
sayıldığını hatırlayın.
Bir sıralı nesnenin elemanlarına sıra numarası atamak için kullanılır. Özellikle döngülerde, bir nesne üzerinden iterasyon yaparken yararlı olur.
Bazı problemlerde, bir veri listesini tararken o verinin bulunduğu konuma dair bilgiye de ihtiyaç duyarız. Basit bir örnek olarak, bir isim listesinde Z ile başlayan isimlerin listedeki konumunu görmek isteyebiliriz. Bu amaçla yazdığımız bir for
döngüsünde enumerate
kullanabiliriz.
isimler = ["Kaan","Meral","Ziya","Fındık"]
for i, isim in enumerate( isimler ):
if "Z" in isim:
print(i,isim)
2 Ziya
Python dışındaki dillere alışık olan programcılar bu işlemi bir while
döngüsüyle ve bir sayaçla yapmaya çalışırlar, örneğin şöyle bir kodla:
isimler = ["Kaan","Meral","Ziya","Fındık"]
i = 0
while i < len(isimler):
if "Z" in isimler[i]:
print(i,isimler[i])
i += 1
2 Ziya
Ancak enumerate
ile for
kullanmak sadeliği ve okunaklılığı açısından tercih edilir.
max
fonksiyonu bir sıralı nesne veya bir dizi parametre alır, aralarından en büyük değerli olanını geri verir.
Dizelerden oluşan bir sıralı nesne verildiğinde max
alfabetik sırada en ileride olanını döndürür.
key
parametresi ile her elemana önceden uygulanacak bir fonksiyon belirleyebilirsiniz ve maksimum bu fonksiyonun sonucuna göre tespit edilir. Söz gelişi, mutlak değer olarak en büyük elemanı bulmak için key=abs
verebilirsiniz.
min
fonksiyonu verilen bir dizinin içinde, veya parametreler içinde en küçük olanını döndürür. Kullanımı max
ile aynıdır.
Bir dizi nesnesi alır ve nesne elemanlarının düzgün sıralanmış olduğu bir liste döndürür.
reverse
parametresiyle sıralama ters çevrilir.
Dizeler alfabetik sıraya konur.
key
parametresine verilen bir fonksiyon sıralamadan önce her elemana uygulanır; sonuç sıralaması bu fonksiyona göre belirlenir.
[(2, -1), (0, 2), (1, 2), (3, 4)]
Python 3 Unicode kullandığı için İngilizce dışı harfleri kullanırken zorluk çıkarmaz. Ama alfabetik sıralama yapmaya çalıştığımızda doğru cevabı alamayabiliriz.
['Ahmet', 'Mehmet', 'Ziya', 'Ümit', 'İsmail', 'Şebnem']
Türkçe alfabeye göre sıralama yapmak için yerellik ayarı yapmalıyız. Bunun için locale
modülünü yüklemeli, ardından da sorted
fonksiyonuna key
parametresi olarak locale.strxfrm
fonksiyonunu vermeliyiz.
Bir sıralı nesnenin elemanlarının toplamını verir. Elemanlar sayısal değere sahip olmalıdır.
Aynı uzunlukta iki veya daha çok listenin aynı konumdaki elemanlarını sırayla alır, bu elemanlardan çokuzlar oluşturur ve bu çokuzların listesini verir.
zip
ile farklı verileri birleştirerek bir for
döngüsünde işlemek mümkün olur. Tıpkı enumerate
gibi zip
de bizi elemanları bir sayaç değişkeniyle takip etme mecburiyetinden kurtarır.