Python’da Liste ve String İşlemleri

Neslihan Şirin Saygılı —  25 Ocak 2015 — Yorum bırakın

Merhaba, bu yazımda deneyimlerimden yola çıkarak Python’da sıklıkla kullandığım veri yapıları ve tiplerinden bahsedeceğim. Bu yapı ve tiplerin içerisinde “liste” (list) ilk sırada gelir, ikinci sırada ise “katar” (string) yer alıyor.

Liste

Listeyi basitçe, köşeli parantez içerisinde virgüllerle ayrılmış elemanlar listesi olarak tanımlamak mümkündür.
liste1 = [1, 4, 9, 16, 25] ve liste2 = ['a', 'b', 'c', 'd'] birer liste örneğidir.
Liste elemanlarının indexlenebilme özelliği bulunur, zaten listeyi bir dizi olarak düşünebiliriz.

l = [1, 34, 274, -89, 0, 5] listesinden -89 elemanını almak için l[3] kullanmak yeterli olacaktır. Konunun daha anlaşılır olması için python terminalinde yaptığım örnekleri ekleyerek devam edeceğim. (Linux veya MacOS X kullanıyorsanız terminale python yazarak python terminaline geçiş yapabilirsiniz.)

list-index

Kodlamaya C ailesiyle başlayanlar için küçük çapta bir mucize olan liste özelliği ise kolayca dilimlenebilme (slicing) özelliğidir.
liste[:] tüm listeyi döner.
liste[alt:] alt indexinden başlayarak listenin kalan elemanlarını döner.
liste[:üst] listenin başından başlayarak üst indexli elemandan bir önceki elemanı kapsayan kısmı döner. (Dikkat: dilimleme işlemi üst elemanı dönmez!)
liste[alt:üst] alt indexinden başlayarak üst indexli elemandan bir önceki elemanı kapsayan kısmı döner.

list-slice

Dilimleme için bir diğer özellik ise vereceğimiz indexlerin negatif olabilmesidir. Eğer liste dilimlerken negatif index veriyorsanız Python size liste elemanlarının indexlerini sondan başlayarak sayacaktir. Yani a[-1] listenin sondan birinci elemanını kast etmektedir. Bu negatif index mantığını açıklamak için aşağıdaki şemayı kullanabiliriz.


[1, 34, 274, -89, 0, 5] 
 0   1   2    3   4  5  index
-6  -5  -4   -3  -2 -1  negatif index

list-negative-slice

Şimdi birkaç temel liste işlemi içeren örnekler ile devam edelim.

*1. Öyle bir fonksiyon yazalım ki, aldığı listenin herhangi bir yerinde 1,2,3 dizilimi görülüyorsa True dönsün, yoksa False dönsün. Fonksiyonun örnek çalışma şeması şu şekildedir;


list123([1, 1, 2, 4, 1]) → False
list123([1, 1, 2, 1, 2, 3]) → True

def list123(nums):
  for i in range(len(nums)-2):        
    if nums[i] == 1 and nums[i+1] == 2 and nums[i+2] == 3:
      return True
  return False

*2. Öyle bir fonksiyon yazalım ki, aldığı en az 1 elemanlı iki sayı listesini ilk ya da son elemanları eşit ise True dönsün, değilse False dönsün. Fonksiyonun örnek çalışma şeması şu şekildedir;


common_end([1, 2, 3], [7, 3]) → True
common_end([1, 2, 3], [7, 3, 2]) → False
common_end([1, 2, 3], [1, 3]) → True

def common_end(a, b):
  return a[0] == b[0] or a[len(a)-1] == b[len(b)-1]

3. Öyle bir fonksiyon yazalım ki, verilen sayı listesinin elemanlarından ortalamaya eşit ya da ortalam üzerinde olan elemanlarını dönsün, eğer sayı 50’den fazlaysa en büyük 50 elemanı dönsün.

def pick_over_average_elements(numbers):
  numbers.sort()
  average = sum(numbers) / float(len(numbers))
  upper_side = [element for element in numbers if element >= average]
  result = [value if value in upper_side]
  if len(result) > 50:
    result = result[-50:]
  return result

Son örnekteki upper_side ile başlayan satıra açıklama getirmek istiyorum, burada yapılan aslında şudur;

upper_side = []
for element in numbers:
  if element >= average:
    upper_side.append(element)

Bizim yaptığımız şekline pythonic yöntem deniliyor. Dikkat edilirse bir alttaki satırda da pythonic yöntemle bir liste oluşturulduğu görülebilir.

Katar (String)

Katar veri tipi ” veya “” karakterleri içerisinde ifade edilir. Liste gibi indexlenebilir ve dilimlenebilir. “join” metoduyla verilen listeyi katara çevirir.

string-join

İki tane katar örneği ile devam edelim.

*1. Öyle bir fonksiyon yazalım ki, aldığı boş olmayan bir katarı şu şekilde işleyip dönsün, kelime içinde ilk harfin yanına ilk iki harfi, bunun yanina ilk üç harfi, bunun yanına ilk dört harfi ekleyip kelimenin tüm harfleri eklenince tamamlaniyor. Fonksiyonun örnek çalışma şeması şu şekildedir;


string_splosion('Code') → 'CCoCodCode'
string_splosion('abc') → 'aababc'
string_splosion('ab') → 'aab'

def string_splosion(str):
  result = ''
  for i in range(len(str)):
    result += str[:i+1]  
  return result

*2. Öyle bir fonksiyon yazalım ki, aldığı katarın ilk 3 karakterini verilen negatif olmayan sayı kadar yanyan yazılmış halini dönsün. Eğer katar 3 karakterden kısaysa tum karakterleri isleme alsın. Fonksiyonun örnek çalışma şeması şu şekildedir;


front_times('Chocolate', 2) → 'ChoCho'
front_times('Chocolate', 3) → 'ChoChoCho'
front_times('Abc', 3) → 'AbcAbcAbc'
def front_times(str, n):
  result = ''
  if len(str) > 2:
    for i in range(n):
      result += str[0:3]
    return result
  else:
    for i in range(n):
      result += str[0:len(str)]
    return result

Örneklerde görüldüğü gibi katarlar üzerinde işlem yapmak oldukça kolay ve eğlencelidir. * işaretli örnekleri codingbat.com[1] sitesinde yaptığım alıştırma örneklerinden aldım. Python’da liste ve string işlemlerinde alıştırma yapmak için codingbat.com sitesini tavsiye edebilirim.

 

Kaynaklar:
1. http://codingbat.com/, en son 25 Ocak 2015 tarihinde erişildi.
2. https://docs.python.org/2.7/, en son 25 Ocak 2015 tarihinde erişildi.

Neslihan Şirin Saygılı

Posts

İTÜ Bilgisayar Mühendisliği bölümünden mezunum, şimdi doktora öğrencisiyim. Temel olarak ilgilendiğim alanlar bilgi edinilmesi (information retrieval), verinin işlenmesi (metin sınıflandırma, yazar tespiti) ve bu verinin bilgiye dönüştürülmesidir. Python, Java, PHP, Ubuntu, HTTP yığını, Linux-Apache-MySQL üçlüsü gündelik olarak kullandığım araçlardır. Prisync'in kurucu yazılımcılarından biriyim.

No Comments

Be the first to start the conversation.

Yorum yapmak için