Listeler¶
Listeleri değiştirmek¶
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:
lst = ["kolay", "basit", "ucuz", "bedava"]
lst[-1]
lst = [3, 5, 7]
lst.append(42)
lst
Append yönteminin “None” döndürdüğünü anlamak önemlidir. Yani dönüş değerini tekrar işlemek mümkün değildir:
lst = [3, 5, 7]
lst = lst.append(42)
print(lst)
• s.pop(i)
‘pop’ s listesindeki i.nci öğeyi döndürür ve bu öğe listeden de silinir.
şehirler = ["İstanbul", "Ankara", "Yozgat", "Eskişehir"]
şehirler.pop(0)
şehirler
şehirler.pop(1)
şehirler
‘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.
şehirler = ["Bursa", "Antalya", "Trabzon"]
şehirler.pop()
şehirler
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:
lst = [42,98,77]
lst2 = [8,69]
lst.append(lst2)
lst
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:
lst = [42,98,77]
lst2 = [8,69]
lst.extend(lst2)
lst
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:
lst = ["a", "b", "c"]
programlama_dili = "Python"
lst.extend(programlama_dili)
print(lst)
Şimdi de bir demetle deneyelim:
lst = ["Java", "C", "PHP"]
t = ("C#", "Jython", "Python", "IronPython")
lst.extend(t)
lst
‘+’ 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.
seviye = ["başlangıç", "orta", "ileri"]
diğer_kelimeler = ["acemi", "uzman"]
seviye + diğer_kelimeler
Dikkatli olun. Asla şunu yapmayın:
L = [3, 4]
L = L + [42]
L
Aynı sonucu almış olsak dahi, bu bakış açısı ‘append’ ve ‘extend’ yöntemlerine alternatif olamaz.
L = [3, 4]
L.append(42)
L
L = [3, 4]
L.extend([42])
L
Arttırma komutu (+=) bir alternatiftir:
L = [3, 4]
L += [42]
L
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:
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)
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:
renkler = ["kırmızı", "yeşil", "mavi", "yeşil", "sarı"]
renkler.remove("yeşil")
renkler
renkler.remove("yeşil")
renkler
renkler.remove("yeşil")
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.
renkler = ["kırmızı", "yeşil", "mavi", "yeşil", "sarı"]
renkler.index("yeşil")
renkler.index("yeşil", 2)
renkler.index("yeşil", 3,4)
renkler.index("siyah")
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.
lst = ["Almanca", "Almanya’da,", "Avusturya’da", "İsviçre’de konuşulur"]
lst.insert(3, "ve")
lst
“append” yönteminin işlevselliğini insert yöntemi ile şu şekilde yakalayabiliriz:
abc = ["a","b","c"]
abc.insert(len(abc),"d")
abc
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.