Listeler

Listeleri değiştirmek

Listen sind Listen, auch Einkaufslisten

Dersimizin bu bölümünde listeleri daha yakından inceleyeceğiz. Listelerin sonuna ve arasına öğe eklemeyi ve ‘remove’ ve ‘pop’ komutları ile öğeleri nasıl sileceğinizi öğreneceksiniz.

Bir liste bir istife benzetilebilir. Bilgisayar biliminde bir istif, veri yapısı olarak görülür ve en az iki işlemi vardır: birincisi istife veri yerleştirme için, ikincisinde de istifin en üstteki öğesini atmak için kullanılır. Çalışma biçimi üst üste yerleştirilmiş tabakların olduğu bir istif düşünülerek anlaşılabilir. Eger bir tabağa ihtiyacınız varsa, genellikle en üstte duranı alırsınız. Temizledikten sonra, kullanılmış tabakları yine istifin en üstüne yerleştirirsiniz. Bir programlama dili istif benzeri veri yapısını destekliyorsa, en az iki işlemi destekliyor demektir:

• push

  Bu yöntem istife yeni bir nesne eklemek için kullanılır. Bakış açısına göre, nesneyi tepeye “iteriz” veya sağ tarafa ekleriz. Python başka programlama dillerinden farklı olarak “push” isimli bir yönteme sahip değil, ancak “append” aynı işlevi gören bir yöntem olarak kullanılabilir. 

• Pop

  Bu yöntem istifin en üstündeki öğeyi döndürür. Bu nesne aynı zamanda istiften de silinir. 

• Peek

  Bazı programlama dilleri başka bir yöntem daha sunar, bu yöntem silme işlemi uygulamadan istifin en üstünde ne olduğunu görüntülemenizi sağlar. Python liste sınıfı böyle bir yönteme sahip değildir, çünkü buna ihtiyaç yoktur. Peek yöntemi -1 indeksine sahip öğeye erişilerek gerçekleştirilebilir: 
In [1]:
lst = ["kolay", "basit", "ucuz", "bedava"]
lst[-1]
Out[1]:
'bedava'

pop ve append

• s.append(x)

Bu yöntem, “s” listesinin sonuna bir öğe ekler.

In [2]:
lst = [3, 5, 7]
lst.append(42)
lst
Out[2]:
[3, 5, 7, 42]

Append yönteminin “None” döndürdüğünü anlamak önemlidir. Yani dönüş değerini tekrar işlemek mümkün değildir:

In [3]:
lst = [3, 5, 7]
lst = lst.append(42)
print(lst)
None
• s.pop(i)

‘pop’ s listesindeki i.nci öğeyi döndürür ve bu öğe listeden de silinir.

In [4]:
şehirler = ["İstanbul", "Ankara", "Yozgat", "Eskişehir"]
şehirler.pop(0)
Out[4]:
'İstanbul'
In [5]:
şehirler
Out[5]:
['Ankara', 'Yozgat', 'Eskişehir']
In [6]:
şehirler.pop(1)
Out[6]:
'Yozgat'
In [7]:
şehirler
Out[7]:
['Ankara', 'Eskişehir']

‘pop’ yöntemi kullanılırken, liste boş ise veya index aralık dışında ise IndexError hatası meydana gelir.

• s.pop()

‘pop’ yöntemi argümansız da çalıştırılabilir. Bu durumda son öğe döndürülür, yani s.pop(-1) ile aynı işi yapar.

In [9]:
şehirler = ["Bursa", "Antalya", "Trabzon"]
şehirler.pop()     
Out[9]:
'Trabzon'
In [10]:
şehirler
Out[10]:
['Bursa', 'Antalya']

extend

Bir listeye bir nesne eklemenin kolay olduğunu gördük. Peki, bir listeye birden çok öğeyi nasıl ekleyeceğiz? Belki başka bir listenin öğelerini kendi listenize eklemek istiyorsunuz. Append yöntemini kullanırsanız, diğer liste alt liste olarak eklenir:

In [9]:
lst = [42,98,77]
lst2 = [8,69]
lst.append(lst2)
lst
Out[9]:
[42, 98, 77, [8, 69]]

Bu amaç için, Python’un ‘extend’ isimli bir yöntemi var. Bu yöntem ile bir liste, demet veya bir kelime dizisi gibi yinelenebilir bir öğenin bütün elemanlarını ekleyerek listeyi genişletebilirsiniz:

In [10]:
lst = [42,98,77]
lst2 = [8,69]
lst.extend(lst2)
lst
Out[10]:
[42, 98, 77, 8, 69]

Bahsettiğimiz üzere, extend’in argümanının bir liste olma zorunluluğu yok. Herhangi bir yinelenebilir nesne olabilir. Yani demetler ve karakter dizileri de olabilir:

In [11]:
lst = ["a", "b", "c"]
programlama_dili = "Python"
lst.extend(programlama_dili)
print(lst)
['a', 'b', 'c', 'P', 'y', 't', 'h', 'o', 'n']

Şimdi de bir demetle deneyelim:

In [11]:
lst = ["Java", "C", "PHP"]
t = ("C#", "Jython", "Python", "IronPython")
lst.extend(t)
lst
Out[11]:
['Java', 'C', 'PHP', 'C#', 'Jython', 'Python', 'IronPython']

‘+’ Operatörü İle Listelerin Genişletilmesi ve Öğelerin Sona Eklenmesi

‘append’ ve ‘extend’ yöntemlerine bir alternatif var. ‘+’ listeleri birleştirmek için kullanılabilir.

In [12]:
seviye = ["başlangıç", "orta", "ileri"]
diğer_kelimeler = ["acemi", "uzman"]
seviye + diğer_kelimeler
Out[12]:
['başlangıç', 'orta', 'ileri', 'acemi', 'uzman']

Dikkatli olun. Asla şunu yapmayın:

In [13]:
L = [3, 4]
L = L + [42]
L 
Out[13]:
[3, 4, 42]

Aynı sonucu almış olsak dahi, bu bakış açısı ‘append’ ve ‘extend’ yöntemlerine alternatif olamaz.

In [14]:
L = [3, 4]
L.append(42)
L
Out[14]:
[3, 4, 42]
In [15]:
L = [3, 4]
L.extend([42])
L
Out[15]:
[3, 4, 42]

Arttırma komutu (+=) bir alternatiftir:

In [16]:
L = [3, 4]
L += [42]
L
Out[16]:
[3, 4, 42]

Aşağıdaki örnekte farklı yaklaşımları deneyecek ve çalışma zamanlarını hesaplayacağız.Aşağıdaki programı anlamak için, time.time() fonksiyonunun kayan noktalı bir değer döndüreceğini bilmeniz gerekiyor. Bu değer “Epoch”1 olarak bilinen zamandan bu yana geçen saniye cinsinden gösterilir. time.time() - for döngüleri için harcanan saniye cinsinden zamanı hesaplar:

In [17]:
import time

n= 100000

start_time = time.time()
l = []
for i in range(n):
    l = l + [i * 2]
print(time.time() - start_time)

start_time = time.time()
l = []
for i in range(n):
    l += [i * 2]
print(time.time() - start_time)

start_time = time.time()
l = []
for i in range(n):
    l.append(i * 2)
print(time.time() - start_time)
28.537325859069824
0.03120279312133789
0.03128385543823242

Gördüğümüz gibi “+” operatörü append yöntemine göre 1268 kat daha yavaş. Açıklaması zor değil: Append yöntemini uygularsak, her döngü geçişinde listeye bir öğe daha ekliyoruz. İlk döngüde l = l + [i * 2] kullanıyoruz. Her döngü adımında liste kopyalanacaktır. Yeni öğe listenin kopyasına eklenecek ve sonuç l değişkenine tekrar atanacaktır. Bu adımdan sonra eski listeye artık ihtiyaç kalmadığından Python tarafından silinecektir. Artırmalı toplama (“+=”) işleminin (ortadaki döngü) “append” kullanan işleme nazaran biraz yavaş olduğunu görüyoruz.

Remove ile bir öğe silmek

Konumunu bilmeye gerek kalmadan, bir liste öğesini “remove” yöntemi ile silmek mümkündür.

 
s.remove(x)
Bu çağrı x’i ilk gördüğü yerde s listesinden siler. X listede yoksa, ValueError hatası meydana gelir.

Aşağıdaki örnekte, “yeşil” rengini üç kez silmek için remove yöntemini kullanacağız. “Yeşil” rengi listede yalnızca iki kere var olduğu için üçüncü denememizde ValueError hatası alacağız:

In [18]:
renkler = ["kırmızı", "yeşil", "mavi", "yeşil", "sarı"]
renkler.remove("yeşil")
renkler
Out[18]:
['kırmızı', 'mavi', 'yeşil', 'sarı']
In [19]:
renkler.remove("yeşil")
renkler
Out[19]:
['kırmızı', 'mavi', 'sarı']
In [20]:
renkler.remove("yeşil")
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-20-f88efeed90da> in <module>
----> 1 renkler.remove("yeşil")

ValueError: list.remove(x): x not in list

Bir Listedeki Öğenin Konumunu Öğrenmek

Bir listede mevcut bir öğenin konumunu öğrenmek için “index” yöntemi kullanılabilir:

 s.index(x[, i[, j]])
Python x’in ilk indeks değerini döndürür. Değer mevcut değilse ValueError oluşur. İsteğe bağlı olan i parametresi verilirse , arama i indeksinden başlar. Eğer j değeri verilirse, arama j konumunda sona erer.

In [21]:
renkler = ["kırmızı", "yeşil", "mavi", "yeşil", "sarı"]
renkler.index("yeşil")
Out[21]:
1
In [22]:
renkler.index("yeşil", 2)
Out[22]:
3
In [23]:
renkler.index("yeşil", 3,4)
Out[23]:
3
In [24]:
renkler.index("siyah")
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-24-331669a8b448> in <module>
----> 1 renkler.index("siyah")

ValueError: 'siyah' is not in list

insert

“Append” yöntemini kullanarak listenin sonuna öğe ekleyebileceğimizi öğrendik. Bir liste ile etkin bir şekilde çalışmak için bir listenin içinde keyfi konumlara öğe ekleyebilmenin bir yolu olmalıdır. Bunu da “insert” yöntemiyle yapacağız.

s.insert(index, object)
“Object” nesnesi “s” listesinde bulunmaktadır. “object” nesnesi s[index] öğesinden önce konumlandırılmak istenmektedir. s[index] “object” olacaktır ve diğer bütün nesneler bir sağa doğru kaydırılacaktır.

In [25]:
lst = ["Almanca", "Almanya’da,", "Avusturya’da", "İsviçre’de konuşulur"]
lst.insert(3, "ve")
lst
Out[25]:
['Almanca', 'Almanya’da,', 'Avusturya’da', 've', 'İsviçre’de konuşulur']

“append” yönteminin işlevselliğini insert yöntemi ile şu şekilde yakalayabiliriz:

In [26]:
abc = ["a","b","c"]
abc.insert(len(abc),"d")
abc
Out[26]:
['a', 'b', 'c', 'd']

Dipnot:

1 Epoch zamanı (Unix zamanı veya POSIX zamanı olarak da bilinir), zamandaki anların tarif edilmesinde kullanılan bir sistemdir, 00:00:00 Koordine Üniversal Zaman (UTC), 1 Ocak 1970 Perşembe anından itibaren geçen sürenin saniye olarak karşılığıdır, bu esnada artık saniyeler sayılmaz.