Python 3'te Dizeleri Dizinleme ve Dilimleme Nasıl Yapılır
Giriş
Python'daki string (dize) veri tipi, harfler, sayılar, boşluk karakterleri veya sembollerden oluşabilecek bir veya daha fazla karakter dizisinden oluşan bir dizidir. Bir dize, bir dizi olduğu için, dizinleme (indexing) ve dilimleme (slicing) yoluyla diğer dizi tabanlı veri tipleri gibi erişilebilir.
Bu eğitimde, dizinleme yoluyla dizelere erişmeyi, karakter dizilerini dilimleyerek işlem yapmayı ve bazı sayma ve karakter konumu yöntemlerini ele alacağız.
Önkoşullar
Bilgisayarınızda veya sunucunuzda Python 3 yüklü olmalı ve bir programlama ortamı kurulu olmalıdır. Eğer bir programlama ortamınız yoksa, işletim sisteminize (Ubuntu, CentOS, Debian vb.) uygun yerel bir programlama ortamı veya sunucu üzerindeki bir programlama ortamı için kurulum rehberlerine bakabilirsiniz.
String'lerin Nasıl Dizinlendiği (Indexing)
Tıpkı bir liste veri tipinde olduğu gibi, dizenin her bir karakteri de bir dizin numarasıyla ilişkilidir ve bu numara 0'dan başlar.
Sammy Shark!
dizesi için dizin numaraları şu şekildedir:
S a m m y S h a r k !
0 1 2 3 4 5 6 7 8 9 10 11
Görüldüğü gibi, ilk S
0 dizin numarasıyla başlar ve dize !
sembolüyle, yani 11 dizin numarasıyla biter.
Ayrıca, Sammy
ve Shark
arasındaki boşluk karakterinin de kendi dizin numarası vardır. Bu durumda, boşluğun dizin numarası 5'tir.
Ünlem işareti (!
) de bir dizin numarası ile ilişkilendirilmiştir. *#$&.;?
, gibi diğer sembol veya noktalama işaretleri de bir karakterdir ve kendi dizin numaralarıyla ilişkilendirilir.
Bir Python dizisinin her bir karakterinin karşılık gelen bir dizin numarası olması, string'lere diğer sıralı veri türlerinde olduğu gibi erişmemize ve onları manipüle etmemize olanak tanır.
Pozitif Dizin Numarası ile Karakterlere Erişim
Dizin numaralarına başvurarak, bir dizinin karakterlerinden birini izole edebiliriz. Bunu, dizin numaralarını köşeli parantez içine alarak yaparız. Bir dize tanımlayalım, yazdıralım ve köşeli parantez içindeki dizin numarasını çağıralım:
Not: Bu eğitimdeki örnek kodları takip etmek için, yerel sisteminizde Python etkileşimli kabuğunu çalıştırarak python3
komutunu çalıştırın. Daha sonra örnekleri kopyalayabilir, yapıştırabilir veya >>>
isteminden sonra ekleyerek düzenleyebilirsiniz.
ss = "Sammy Shark!"
print(ss[4])
Çıktı:
y
Bir dizinin belirli bir dizin numarasına başvurduğumuzda, Python o pozisyondaki karakteri döndürür. ss = "Sammy Shark!"
dizesinde 4 dizin numarasındaki karakter y
olduğu için, print(ss[4])
yazdırdığımızda y
çıktısını alırız.
Dizin numaraları, dizinin içindeki belirli karakterlere erişmemizi sağlar.
Negatif Dizin Numarası ile Karakterlere Erişim
Eğer uzun bir dizimiz varsa ve sonuna yakın bir öğeyi hedeflemek istiyorsak, dizinin sonundan başlayarak, dizin numarasını-1
'den başlatarak geriye doğru da sayabiliriz.
Aynı Sammy Shark!
dizesi için negatif dizin numaraları şu şekildedir:
S a m m y S h a r k !
-12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1
Negatif dizin numaralarını kullanarak, dizinin -3 dizin numarasındaki r
karakteri yazdırabiliriz:
print(ss[-3])
Çıktı:
r
Negatif dizin numaralarını kullanmak, uzun bir dizinin sonuna yakın tek bir karakteri izole etmek için avantajlı olabilir.
String'leri Dilimleme (Slicing)
Bir string içindeki karakterlerin bir aralığını da çağırabiliriz. Örneğin, sadece Shark
kelimesini yazdırmak istiyorsak, bir dilim (slice) oluşturarak, bu da
orijinal bir dize içindeki karakter dizisidir, bunu yapabiliriz.
Dilimlerle, iki dizin numarası aralığı oluşturarak birden fazla karakter
değerini çağırabiliriz [x:y]
:
print(ss[6:11])
Çıktı:
Shark
Bir dilim oluştururken, [6:11]
örneğindeki
gibi, ilk dizin numarası dilimin başladığı yerdir (dahil), ikinci dizin
numarası ise dilimin bittiği yerdir (hariç), bu yüzden yukarıdaki
örneğimizde aralık, dizenin bittiği numaradan sonrasını içermelidir.
Dizileri dilimlerken, bir alt dize (substring) oluşturuyoruz; bu, aslında başka bir dize içinde var olan bir dizidir. ss[6:11]
çağırdığımızda, Sammy Shark!
dizisi içindeki Shark
alt dizisini çağırıyoruz.
Eğer dizinin herhangi bir ucunu dahil etmek istiyorsak, string[n:n]
söz diziminde sayılardan birini atlayabiliriz. Örneğin,ss
dizisinin ilk kelimesini — “Sammy” — yazdırmak istiyorsak:
print(ss[:5])
Çıktı:
Sammy
Bunu, dilim sözdizimindeki iki nokta üst üste öncesinde dizin numarasını atlatarak ve sadece iki nokta üst üste sonrasındaki dizin numarasını dahil ederek yaptık, bu da alt dizenin sonuna atıfta bulunur.
Bir dizenin ortasından başlayıp sonuna kadar yazdırmak istersek, sadece iki nokta üst üste öncesindeki dizin numarasını dahil ederek yapabiliriz:
print(ss[7:])
Çıktı:
hark!
İki nokta üst üste öncesindeki dizin numarasını dahil edip ikinci dizin numarasını sözdiziminde boş bırakarak, alt dize çağrılan dizin numarasının karakterinden dizenin sonuna kadar gidecektir.
Bir dizeyi dilimlemek için negatif dizin numaralarını da kullanabilirsiniz. Daha önce gördüğümüz gibi, bir dizenin negatif dizin numaraları -1'den başlar ve dizenin başına kadar geri sayar. Negatif dizin numaralarını kullanırken, dilimlerde olduğu gibi daha düşük numarayı ilk olarak yazacağız çünkü bu, dizede daha önce gelir.
İki negatif dizin numarasını kullanarak ss
dizisini dilimleyelim:
print(ss[-4:-1])
Çıktı
ark
"Sammy Shark!" dizisinden "ark" alt dizesi yazdırılır çünkü "a" karakteri -4 dizin numarası pozisyonunda bulunur ve "k" karakteri -1 dizin numarası pozisyonundan önce gelir.
String Dilimlerken Adım (Stride) Belirleme
Dize dilimleme, iki dizin numarasına ek olarak üçüncü bir parametre kabul edebilir. Üçüncü parametre, adımı (stride) belirtir, bu da dizenin ilk karakterinden sonra kaç karakter ileri gidileceğini ifade eder. Şu ana kadar adım parametresini atladık ve Python, iki dizin numarası arasındaki her karakterin alındığı varsayılan adımı 1 olarak belirledi.
Yukarıdaki "Shark" alt dizisini yazdıran örneği gözden geçirelim:
print(ss[6:11])
Çıktı
Shark
Aynı sonuçları 1 adım ile üçüncü bir parametre ekleyerek elde edebiliriz:
print(ss[6:11:1])
Çıktı
Shark
Yani, 1 adımı, bir dilimdeki iki dizin numarası arasındaki her karakteri alır. Eğer adım parametresini atlıyorsak, Python varsayılan olarak 1 ile devam edecektir.
Eğer adımı artırırsak, karakterlerin atlandığını göreceğiz:
print(ss[0:12:2])
Çıktı
SmySak
Stride (adım aralığı) parametresini 2 olarak belirlemek, Python söz diziminde ss[0:12:2]
her iki karakterden birini atlayarak alt dize oluşturur. Vurgulanan karakterleri inceleyelim:
S a m m y S h a r k !
Gördüğünüz gibi, indeks numarası 5 olan boşluk karakteri de stride (adım aralığı) 2 olduğunda atlanır.
Eğer adım aralığı parametremiz için daha büyük bir sayı kullanırsak, çok daha küçük bir alt dize elde ederiz:
print(ss[0:12:4])
Çıktı
Sya
Python söz diziminde ss[0:12:4]
adım
aralığı parametresini 4 olarak belirlemek, sadece her dört karakterden
birini yazdırır. Vurgulanan karakterlere tekrar bakalım:
S amm y Sh a rk!
Bu örnekte de, boşluk karakteri atlanmıştır.
Bütün diziyi yazdırmak istiyorsak, iki indeks numarasını atlayıp sözdiziminde iki noktayı koruyarak aynı sonucu elde edebiliriz:
print(ss[::4])
Çıktı
Sya
İki indeks numarasını atlayıp sadece iki noktayı tutmak, tüm diziyi kapsam içinde tutacak, son parametre olarak adım aralığını eklemek ise kaç karakterin atlanacağını belirleyecektir.
Ayrıca, adım aralığı (stride) için negatif bir sayısal değer belirtebiliriz; bu, dizeyi ters sırada yazdırmak için adım aralığını -1 olarak ayarladığımızda kullanılabilir:
print(ss[::-1])
Çıktı
!krahS ymmaS
Parametreler belirtilmeden iki nokta kullanmak, orijinal dizideki tüm karakterleri içerecektir. Adım aralığı 1 olan bir stride, hiçbir karakteri atlamadan her karakteri içerecek, bu adımın negatif olması ise karakterlerin sırasını tersine çevirecektir.
Aynı işlemi bir de adım aralığı -2 ile yapalım:
print(ss[::-2])
Çıktı
!rh ma
Bu örnekte, ss[::-2]
, parametrelerde
herhangi bir indeks numarası belirtilmediği için orijinal stringin
tamamıyla ilgileniyoruz ve negatif adım kullanarak stringi ters
çeviriyoruz. Ayrıca, -2 adımı kullanarak, ters çevrilmiş stringdeki her
iki harften birini atlıyoruz:
! k r a h S [boşluk] y m m a S
Boşluk karakteri bu örnekte yazdırılmıştır.
Python dilindeki dilimleme söz diziminin üçüncü parametresini belirleyerek, orijinal stringden aldığınız alt dizinin adımını belirtmiş oluyorsunuz.
Burada dilimi ters çevirip dizeyi tam tersine çevirdik. Tersine çevirme işlemi bir dize dilimini ters çevirdiği için Python'da yaygın bir işlemdir.
Sayma Yöntemleri
Dizeler içindeki karakterlere karşılık gelen ilgili indeks numaralarını düşünürken, dizeleri sayan veya indeks numaralarını döndüren bazı yöntemlerden geçmek faydalı olacaktır. Bu, kullanıcı girişi formunda kabul etmek istediğimiz karakter sayısını sınırlamak veya dizeleri karşılaştırmak için yararlı olabilir. Diğer sıralı veri türleri gibi, dizeler de çeşitli yöntemlerle sayılabilir.
İlk olarak, sıralı veya sırasız olan, dizeler, listeler, demetler
(tuples) ve sözlükler (dictionaries) dahil olmak üzere herhangi bir veri
türünün uzunluğunu alabilen len()
metoduna bakacağız.
Dizenin ss
uzunluğunu yazdıralım:
print(len(ss))
Çıktı
12
“Sammy Shark!” dizesi, boşluk karakteri ve ünlem işareti dahil olmak üzere 12 karakter uzunluğundadır.
Bir değişken kullanmak yerine, bir dizgeyi doğrudan len()
metoduna da geçirebiliriz:
print(len("Let's print the length of this string."))
Çıktı
38
len()
metodu, bir dize içindeki toplam karakter sayısını sayar.
Bir dizide belirli bir karakterin veya karakter dizisinin kaç kez göründüğünü saymak istiyorsak, bunu str.count()
metodu ile yapabiliriz. ss = "Sammy Shark!"
dizgesi ile çalışalım ve “a” karakterinin kaç kez göründüğünü sayalım:
print(ss.count("a"))
Çıktı
2
Başka bir karakter arayabiliriz:
print(ss.count("s"))
Çıktı
0
Dizge içinde “S” harfi olmasına rağmen, her karakterin
büyük/küçük harf duyarlılığına sahip olduğunu unutmamak önemlidir. Bir
dizideki tüm harfleri büyük/küçük harfe bakılmaksızın aramak istiyorsak,
önce dizgeyi str.lower()
metodunu kullanarak tamamen küçük
harfe dönüştürebiliriz. Bu yöntem hakkında daha fazla bilgiyi “Python
3'te Dize Yöntemlerine Giriş” başlıklı makalede okuyabilirsiniz.
Bir karakter dizisiyle str.count()
metodunu deneyelim:
likes = "Sammy likes to swim in the ocean, likes to spin up servers, and likes to smile."
print(likes.count("likes"))
Çıktı
3
likes
dizesinde, “likes” karakter dizisine eşdeğer olan karakter dizisi orijinal dizgede 3 kez geçmektedir.
Bir dizide bir karakterin veya karakter dizisinin hangi konumda
olduğunu da bulabiliriz. Bunu, karakterin indeks numarasına dayalı
konumunu döndürecek olan str.find()
metodu ile yapabiliriz.
ss
dizgesinde ilk “m”nin nerede geçtiğini kontrol edelim:
print(ss.find("m"))
Çıktı
2
İlk “m” karakteri, “Sammy Shark!” dizgesinde 2 indeks konumunda geçmektedir. ss
dizgesinin yukarıdaki indeks numarası konumlarını inceleyebiliriz.
likes
dizgesinde ilk “likes” karakter dizisinin nerede geçtiğini kontrol edelim:
print(likes.find("likes"))
Çıktı
6
“likes” karakter dizisinin ilk örneği, “likes” dizgesinin 6. indeks numarasında başlar; bu, likes
dizisinin l
karakterinin konumlandığı yerdir.
İkinci “likes” dizisinin nerede başladığını görmek istersek ne olur? Bunu, str.find()
metoduna belirli bir indeks numarasından başlayacak ikinci bir
parametre geçirerek yapabiliriz. Dizgenin başlangıcından başlamak
yerine, 9 indeks numarasından sonra başlayalım:
print(likes.find("likes", 9))
Çıktı
34
indeks numarasında başlayan bu ikinci örnekte, “likes” karakter dizisinin ilk geçtiği yer 34. indeks numarasındadır.
Ek olarak, üçüncü bir parametre olarak aralığın sonunu belirtebiliriz. Dilimleme (slicing) gibi, bunu negatif bir indeks numarası kullanarak geriye doğru sayarak yapabiliriz:
print(likes.find("likes", 40, -6))
Çıktı
64
Bu son örnek, “likes” dizisinin konumunu 40 ve -6 indeks numaraları arasında arar. Girilen son parametre negatif bir sayı olduğundan, orijinal dizgenin sonundan itibaren sayacaktır.
len()
, str.count()
, ve str.find()
dize metodları, dizeler içindeki karakterlerin veya karakter
dizilerinin uzunluğunu, sayısını ve indeks konumlarını belirlemek için
kullanılabilir.
Sonuç
Dizelerin belirli indeks numaralarını veya bir dizenin belirli bir dilimini çağırabilmek, bu veri türüyle çalışırken bize daha fazla esneklik sağlar. Dizeler, listeler ve demetler gibi sıralı bir veri türü olduklarından, indeksleme ve dilimleme yoluyla erişilebilirler.
Lisa Tagliaferri tarafından yazılan How To Index and Slice Strings in Python 3 a Programming makalesinin düzenlenmiş çevirisi
Daha Fazla Oku:
- Sonraki Makale:Python 3'te Veri Türleri Nasıl Dönüştürülür
- Önceki Makale:Python 3'te Dize Fonksiyonlarına Giriş