İçeriğe geç

leetcode

5 posts with the tag “leetcode”

Python Counter Sınıfı Kullanımı

Python Counter Sınıfı Kullanımı

Python’un collections modülünde yer alan Counter sınıfı, sayım yapma işlemini kolaylaştıran bir veri yapısıdır. Özellikle bir iterable (örneğin listeler, stringler vb.) içerisindeki öğelerin frekansını hızlıca bulmak için kullanılır. Counter sınıfının çıktısı bir sözlüktür(dictionary). İçine string veya herhangi bir liste gönderdiğimizde liste içindeki her bir elemanın frekansını hesaplar ve sonuç olarak bir dictionary döndürür. Mülakatlar esnasında ilgili soruda bir dizi ve listenin elemanlarının frekansını bulmak için tekerleği yeniden icat etmeden Counter sınıfını kullanıp kullanamayacağınızı başta sorabilir ve bu sınıfı kullanarak soruyla ilgili diğer kısımları implement ederken zaman kazanabilirsiniz. Bu sınıfın zaman ve bellek karmaşıklığı O(n)’dir.

1. Counter Nedir?

Counter, bir iterable içerisindeki öğelerin kaç kez tekrarlandığını saymak için kullanılan bir sınıftır. Bir sözlük gibi çalışır; anahtarlar iterable içerisindeki öğeler olurken, değerler ise bu öğelerin kaç kez tekrarlandığını gösterir.

Örnek Kullanım:

from collections import Counter
metin = "python programming"
counter = Counter(metin)
print(counter)

Çıktı:

Counter({'p': 2, 'o': 2, 'g': 2, 'r': 2, 'm': 2, 'n': 1, 'y': 1, 't': 1, 'h': 1, 'i': 1})

Bu örnekte, Counter sınıfı her harfi sayar ve frekansını verir.

2. Counter Oluşturma

Counter sınıfı birkaç farklı yolla oluşturulabilir:

2.1. Liste, String veya Diğer Iterable Üzerinden

from collections import Counter
liste = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
counter = Counter(liste)
print(counter)

Çıktı:

Counter({4: 4, 3: 3, 2: 2, 1: 1})

2.2. Sözlükten

Bir sözlüğü Counter sınıfına vererek de bir sayaç oluşturulabilir.

from collections import Counter
sozluk = {'elma': 3, 'armut': 2, 'kiraz': 5}
counter = Counter(sozluk)
print(counter)

Çıktı:

Counter({'kiraz': 5, 'elma': 3, 'armut': 2})

2.3. Anahtar-Değer Çiftleri ile

Counter, anahtar-değer çiftleri ile doğrudan da oluşturulabilir:

counter = Counter(elma=3, armut=2, kiraz=5)
print(counter)

Çıktı:

Counter({'kiraz': 5, 'elma': 3, 'armut': 2})

3. Counter Sınıfının Temel Metotları

3.1. elements()

Counter’daki her öğeyi, sayısı kadar tekrar eden bir iterator döndürür.

counter = Counter(a=2, b=3, c=1)
print(list(counter.elements()))

Çıktı:

['a', 'a', 'b', 'b', 'b', 'c']

3.2. most_common()

Bu metod, en yaygın öğeleri ve frekanslarını sıralı bir şekilde döndürür.

counter = Counter('mississippi')
print(counter.most_common(2)) # En yaygın 2 öğeyi döndürür

Çıktı:

[('i', 4), ('s', 4)]

3.3. subtract()

Bu metod, sayacın öğelerinden çıkartma yapar. Bir iterable veya başka bir Counter nesnesi kullanılabilir.

counter = Counter(a=4, b=2, c=0, d=-2)
counter.subtract(Counter(a=1, b=2, c=3, d=1))
print(counter)

Çıktı:

Counter({'a': 3, 'c': -3, 'd': -3, 'b': 0})

4. Counter ile Aritmetik İşlemler

Counter sınıfı aritmetik işlemleri destekler. İki Counter nesnesi arasında toplama, çıkarma, kesişim (min), birleşim (max) gibi işlemler yapılabilir.

4.1. Toplama

İki Counter’ı toplayarak her öğenin frekanslarını birleştirebilirsiniz:

counter1 = Counter(a=3, b=1)
counter2 = Counter(a=1, b=2, c=1)
print(counter1 + counter2)

Çıktı:

Counter({'a': 4, 'b': 3, 'c': 1})

4.2. Çıkarma

İki Counter’ı çıkararak öğelerin frekanslarını fark alabilirsiniz:

print(counter1 - counter2)

Çıktı:

Counter({'a': 2})

4.3. Kesişim (min)

İki Counter’ın kesişimi, her öğenin minimum frekansını alır:

print(counter1 & counter2)

Çıktı:

Counter({'a': 1, 'b': 1})

4.4. Birleşim (max)

İki Counter’ın birleşimi, her öğenin maksimum frekansını alır:

print(counter1 | counter2)

Çıktı:

Counter({'a': 3, 'b': 2, 'c': 1})

5. Gerçek Dünya Kullanım Alanları

Counter sınıfı, birçok gerçek dünya probleminde kullanılabilir. Örneğin, bir metindeki harflerin veya kelimelerin frekansını bulma, bir anketten en popüler yanıtları toplama gibi işlemler için oldukça faydalıdır.

5.1. Bir Metindeki Kelime Frekansını Bulma

metin = "python is great and python is dynamic"
kelimeler = metin.split()
counter = Counter(kelimeler)
print(counter.most_common(2)) # En yaygın iki kelime

Çıktı:

[('python', 2), ('is', 2)]

5.2. Oylama Sonuçlarını Hesaplama

oylar = ['A', 'B', 'A', 'C', 'B', 'A']
counter = Counter(oylar)
print(counter)

Çıktı:

Counter({'A': 3, 'B': 2, 'C': 1})

Sonuç

Python’un Counter sınıfı, öğelerin frekanslarını hızlı ve etkili bir şekilde saymak için kullanışlı bir araçtır. Aritmetik işlemler, kesişim ve birleşim gibi özellikler sayesinde veri analizi ve istatistiksel işlemler için oldukça uygundur. Günlük programlama problemlerinde sıkça kullanılabilecek bu veri yapısı, özellikle büyük veri setlerinde oldukça faydalıdır.

Python'da yield Özelliğinin Kullanımı

Python yield Özelliği

Python’da yield anahtar kelimesi, fonksiyonların değer üretip duraklatılmasını sağlayan ve bu sayede bir iterator yaratan bir yapıdır. yield anahtar kelimesi, fonksiyonları birer jeneratöre dönüştürerek her çağrıldığında bir değer döndüren ve durduğu yerden devam edebilen fonksiyonlar oluşturur.

yield ile Fonksiyonlar

Normal bir fonksiyonda return ifadesi kullanıldığında, fonksiyon bir değer döndürür ve biter. Ancak yield kullanıldığında, fonksiyon bir değer döndürür ve kaldığı yerden çalışmaya devam eder. Jeneratörler, belleği daha verimli kullanmak için tercih edilir çünkü tüm sonuçları aynı anda bellekte tutmak yerine ihtiyaca göre üretirler.

Örnek:

def sayilar():
for i in range(5):
yield i
gen = sayilar()
for num in gen:
print(num)

Çıktı:

0
1
2
3
4

Bu örnekte, yield her bir adımda bir sayı üretir ve duraklatır.

yield ve Jeneratörlerin Avantajları

Jeneratörler, büyük veri setleriyle çalışırken veya hesaplamaları adım adım yapmak istendiğinde avantaj sağlar. Büyük bir listeyi veya veriyi bellekte tutmak yerine, yield kullanarak sadece gerekli olan veriler üretilebilir.

Bellek Verimliliği:

def buyuk_liste():
for i in range(10**6):
yield i
gen = buyuk_liste()

Bu sayede milyonlarca öğe aynı anda bellekte tutulmaz, sadece gerekli olan öğe üretilir.

Jeneratörlerin Durumu Korumak

Jeneratörler, kaldıkları yeri hatırlama yeteneğine sahiptir. Yani yield kullanılarak duraklatılan fonksiyon, bir sonraki çağrıda kaldığı yerden devam eder.

Örnek:

def say():
print("Başlıyor")
yield 1
print("Devam ediyor")
yield 2
print("Bitiyor")
gen = say()
print(next(gen)) # Başlıyor ve 1 döner
print(next(gen)) # Devam ediyor ve 2 döner

Çıktı:

Başlıyor
1
Devam ediyor
2
Bitiyor

Burada fonksiyon her yield ifadesinde duraklar ve sonraki next() çağrısı ile kaldığı yerden devam eder.

yield ve return Farkı

return, bir fonksiyonun çalışmasını sonlandırırken yield, fonksiyonu duraklatır ve daha sonra kaldığı yerden devam etmesini sağlar. Aynı fonksiyon içinde hem yield hem return kullanılabilir, ancak return, jeneratörün sonunu belirtir.

Örnek:

def karisik():
yield 1
yield 2
return "Bitti"
yield 3 # Bu kısım çalışmaz
gen = karisik()
print(next(gen))
print(next(gen))
print(next(gen)) # StopIteration hatası

Çıktı:

1
2
StopIteration: Bitti

return ifadesi çalıştığında jeneratör sona erer ve sonraki yield çalışmaz.

Sonsuz Jeneratörler

yield, sonsuz döngülerde de kullanılabilir. Bu şekilde bir jeneratör, talep üzerine sınırsız sayıda değer üretebilir.

Örnek:

def sonsuz_sayilar():
i = 0
while True:
yield i
i += 1
gen = sonsuz_sayilar()
print(next(gen)) # 0
print(next(gen)) # 1
print(next(gen)) # 2

Bu örnekte, while True döngüsü ile jeneratör sonsuz bir şekilde sayı üretmeye devam eder.

yield from

Python 3.3 ile birlikte gelen yield from ifadesi, başka bir jeneratörden değerleri doğrudan delege etmek için kullanılır. Bu, özellikle jeneratörler arasında değerleri zincirlemek için kullanışlıdır.

Örnek:

def alt_jeneratör():
yield 1
yield 2
def ana_jeneratör():
yield from alt_jeneratör()
yield 3
for deger in ana_jeneratör():
print(deger)

Çıktı:

1
2
3

Bu örnekte, yield from, alt_jeneratör fonksiyonundaki değerleri doğrudan ana jeneratöre delege eder.


Sonuç

yield anahtar kelimesi, Python’da jeneratörler oluşturmanın en temel yoludur. Jeneratörler, belleği verimli kullanarak büyük veri setleriyle çalışmak veya sonsuz veri akışlarını işlemek için oldukça faydalıdır. Ayrıca yield ile fonksiyonların duraklatılıp kaldığı yerden devam etmesi sağlanabilir, bu da onları güçlü bir araç haline getirir.

Python Veri Yapıları - String

Python ile String Manipülasyonu

String, Python’da metin verilerini temsil eden bir veri tipidir. Bir string, tek tırnak (’ ’) veya çift tırnak (” ”) içerisinde yazılarak oluşturulur. String’ler üzerinde çeşitli işlemler yapılabilir; bu makalede, string manipülasyonu için yaygın kullanılan 20 örnek ve döngü ile karakterleri gezmek için 7 farklı yöntem ele alınacaktır.

1. Birleştirme (Concatenation)

İki veya daha fazla string’in birleştirilmesi aşağıdaki şekilde yapılır.

str1 = "Merhaba"
str2 = "Dünya"
sonuc = str1 + " " + str2
print(sonuc) # Çıktı: Merhaba Dünya

Bir string içinde belirli bir alt string’in olup olmadığı aşağıdaki şekilde kontrol edilir.

text = "Python programlama"
bulunan = "program" in text
print(bulunan) # Çıktı: True

3. Büyük/Küçük Harf Dönüştürme

String’in tamamen büyük veya küçük harflere dönüştürülmesi aşağıdaki gibi yapılır.

text = "Merhaba"
print(text.upper()) # Çıktı: MERHABA
print(text.lower()) # Çıktı: merhaba

4. Başlangıç/Bitiş Kontrolü (startswith, endswith)

Bir string’in belirli bir kelimeyle başlayıp başlamadığı veya bitip bitmediği şu şekilde kontrol edilir.

text = "Python programlama"
print(text.startswith("Python")) # Çıktı: True
print(text.endswith("lama")) # Çıktı: True

5. Parçalama (Splitting)

String’in belirli bir karaktere veya boşluğa göre parçalara ayrılması aşağıdaki şekilde yapılır.

text = "Python,Java,C++"
diller = text.split(",")
print(diller) # Çıktı: ['Python', 'Java', 'C++']

6. Dizeyi Birleştirme (Joining)

Liste halindeki string’lerin tek bir string halinde birleştirilmesi aşağıdaki gibidir.

diller = ['Python', 'Java', 'C++']
birlesmis = ", ".join(diller)
print(birlesmis) # Çıktı: Python, Java, C++

7. Karakter Değiştirme (Replacing)

Bir string içinde belirli karakterlerin başka karakterlerle değiştirilmesi şu şekilde yapılır.

text = "Merhaba Dünya"
yeni_text = text.replace("Dünya", "Python")
print(yeni_text) # Çıktı: Merhaba Python

8. Boşlukları Kırpma (Stripping)

String’in başındaki veya sonundaki boşlukların kaldırılması aşağıdaki gibidir.

text = " Merhaba "
print(text.strip()) # Çıktı: Merhaba
print(text.lstrip()) # Sadece baştaki boşlukları kaldırır
print(text.rstrip()) # Sadece sondaki boşlukları kaldırır

9. Dilimleme (Slicing)

String’in belirli bir kısmının seçilmesi şu şekilde yapılır.

text = "Python Programlama"
print(text[0:6]) # Çıktı: Python
print(text[7:]) # Çıktı: Programlama

10. Formatlama (Formatting)

String’lere değişken yerleştirerek dinamik içerik oluşturma aşağıdaki gibidir.

isim = "Ahmet"
yas = 25
mesaj = f"{isim} {yas} yaşında."
print(mesaj) # Çıktı: Ahmet 25 yaşında.

Elbette, string manipülasyonunda daha fazla örnek ve işlem ekleyebilirim. Karakterleri gezme ve diğer string işlemleriyle ilgili bazı ek örnekler:

11. Karakterleri Gezme (Iterating Over Characters)

Bir string’in karakterlerini tek tek gezmek için for döngüsü kullanabilirsiniz.

text = "Python"
for karakter in text:
print(karakter)
# Çıktı:
# P
# y
# t
# h
# o
# n

12. Karakter Dizini Bulma (Finding Index)

Bir karakterin veya alt string’in dizini (indeksi) bulunabilir.

text = "Merhaba Dünya"
index = text.find("Dünya")
print(index) # Çıktı: 8

find metodu karakteri bulamazsa -1 döner.

13. Sayma (Counting)

Bir string içinde belirli bir karakterin veya alt string’in kaç kez geçtiğini sayabilirsiniz.

text = "Merhaba Merhaba"
sayim = text.count("Merhaba")
print(sayim) # Çıktı: 2

14. Baş Harfleri Büyük Yapma (Capitalize, Title)

String’in ilk harfini veya her kelimenin baş harfini büyük yapabilirsiniz.

text = "python programlama"
print(text.capitalize()) # Çıktı: Python programlama
print(text.title()) # Çıktı: Python Programlama

15. String Ters Çevirme (Reversing a String)

String’i ters çevirebilirsiniz.

text = "Python"
ters = text[::-1]
print(ters) # Çıktı: nohtyP

16. Karakterleri Unicode veya ASCII Koduna Çevirme

ord fonksiyonu bir karakterin Unicode kodunu verirken, chr fonksiyonu bir sayıyı Unicode karakterine çevirir.

karakter = 'A'
ascii_degeri = ord(karakter)
print(ascii_degeri) # Çıktı: 65
sayi = 66
karakter = chr(sayi)
print(karakter) # Çıktı: B

17. String İçinde Karakter Seti Kontrolü (isalpha, isdigit, isalnum)

Bir string’in sadece harflerden, sayılardan veya alfanumerik karakterlerden oluşup oluşmadığını kontrol edebilirsiniz.

text = "Python123"
print(text.isalpha()) # Çıktı: False (sadece harf değil)
print(text.isdigit()) # Çıktı: False (sadece rakam değil)
print(text.isalnum()) # Çıktı: True (harf ve rakamlardan oluşuyor)

18. Doldurma (Padding)

Bir string’in başına veya sonuna belirli bir karakter ekleyerek uzunluğunu sabitleyebilirsiniz.

text = "Python"
text_sol = text.ljust(10, '*') # Çıktı: Python****
text_sag = text.rjust(10, '-') # Çıktı: ----Python
text_ortala = text.center(10, '=') # Çıktı: ==Python==
print(text_sol, text_sag, text_ortala)

19. İçerik Değiştirme ile Tersine Çevirme

String içinde belirli bir karakter dizisini tersine çevirmek için dilimleme kullanabilirsiniz.

text = "Merhaba Dünya"
degistirilen = text.replace("Dünya", "Python"[::-1])
print(degistirilen) # Çıktı: Merhaba nohtyP

20. Çoklu Değiştirme (Maketrans ve Translate)

Bir string’in karakterlerini topluca değiştirmek için str.maketrans ve translate yöntemlerini kullanabilirsiniz.

text = "Merhaba Dünya"
cevirici = str.maketrans("aeiou", "12345")
yeni_text = text.translate(cevirici)
print(yeni_text) # Çıktı: M2rh1b1 D5ny1

String’deki Karakterleri Gezmek(Iteration) için Kullanılabilecek Yöntemler:

1. Karakterleri Gezme (Iterating Over Characters)

Bir string’in karakterlerinin tek tek gezilmesi şu şekilde yapılır.

text = "Python"
for karakter in text:
print(karakter)
# Çıktı:
# P
# y
# t
# h
# o
# n

2. While Döngüsü ile Gezme

while döngüsüyle string’in uzunluğunu kontrol ederek indeks bazlı gezinti şu şekilde yapılır.

text = "Python"
i = 0
while i < len(text):
print(text[i])
i += 1
# Çıktı:
# P
# y
# t
# h
# o
# n

3. enumerate fonksiyonunu kullanarak gezme

enumerate fonksiyonu, hem karakterin hem de indeksin gezilmesi için kullanılır.

text = "Python"
for i, karakter in enumerate(text):
print(f"İndeks {i}: {karakter}")
# Çıktı:
# İndeks 0: P
# İndeks 1: y
# İndeks 2: t
# İndeks 3: h
# İndeks 4: o
# İndeks 5: n

4. İteratör (Iterator) Kullanarak Karakter Gezme

String’ler iteratörler olarak davranır, bu nedenle iter() ve next() ile gezinti şu şekilde yapılır.

text = "Python"
it = iter(text)
while True:
try:
karakter = next(it)
print(karakter)
except StopIteration:
break
# Çıktı:
# P
# y
# t
# h
# o
# n

5. Lambda ve map Fonksiyonu ile Gezme

lambda ve map fonksiyonlari yardimiyla karakter dizisini gezerken ayni zamanda istediğimiz formata dönüştürebilir, filtreleyebiliriz. Aşağıda map örneği verilmiştir.

text = "Python"
# Her karakteri büyük harfe çevirip yazdırma
list(map(lambda x: print(x.upper()), text))
# Çıktı:
# P
# Y
# T
# H
# O
# N

6. List Comprehension ile Gezme

Liste ifadeleri (list comprehension) [ ve ] karakterleri arasına döngü ifadesi konulmasıyla yapılan özel bir işlemdir. Aşağıda ters_karakterlerin bir dizi olduğunu sonradan gelen ifadenin [ ve ] arasında olmasından anlıyoruz.

text = "Python"
# Her karakteri ters sırayla bir listeye koyma
ters_karakterler = [karakter for karakter in text[::-1]]
print(ters_karakterler) # Çıktı: ['n', 'o', 'h', 't', 'y', 'P']

Bu makalede, Python ile karakter dizisi(string manipülasyonu) ve string’de yer alan karakterlerin nasıl gezilebileceğini göstermeye çalıştım. Her bir yöntemin farklı kullanım alanları ve avantajları bulunmaktadır. İhtiyacınıza göre uygun olan yöntemi seçerek string işlemlerinizi gerçekleştirebilirsiniz.

Python Veri Yapıları - Dictionary

Python’da Dictionary(Sözlük) Veri Yapısı:

Python’da dictionary (sözlük), anahtar-değer çiftlerini saklayan ve veri arama, ekleme ve silme işlemleri için optimize edilmiş bir veri yapısıdır. Bu makalede, dictionary veri yapısı ile ilgili temel işlemler ve kullanım örnekleri ele alınacaktır:

  1. Dictionary’e Eleman Atama
  2. Dictionary Elemanlarını Gezme
  3. Dictionary İndeks Kullanarak Gezme
  4. Dictionary’de Bir Anahtarın Varlığını Kontrol Etme
  5. items() Fonksiyonunun Kullanımı
  6. Dictionary İşlemlerinin Zaman ve Bellek Karmaşıklıkları (Complexıty)

1. Dictionary’e Eleman Atama

Dictionary’ye eleman atama işlemi, belirli bir anahtara değer atama veya yeni anahtar-değer çifti ekleme şeklinde olabilir.

a. Belirli Bir Anahtara Değer Atama

Var olan bir anahtarın değerini güncelleyebilir veya yeni bir anahtar-değer çifti ekleyebilirsiniz.

my_dict = {"apple": 1, "banana": 2}
my_dict["apple"] = 3 # Mevcut 'apple' anahtarının değeri güncellenir
my_dict["cherry"] = 5 # Yeni bir anahtar-değer çifti eklenir
print(my_dict) # Çıktı: {'apple': 3, 'banana': 2, 'cherry': 5}

b. Eleman Silme

del anahtar kelimesi veya pop() metodu kullanılarak belirli bir anahtar silinebilir.

# 'banana' anahtarını silme
del my_dict["banana"]
print(my_dict) # Çıktı: {'apple': 3, 'cherry': 5}
# 'apple' anahtarını pop ile silme
value = my_dict.pop("apple")
print(my_dict) # Çıktı: {'cherry': 5}
print("Silinen değerin değeri:", value) # Çıktı: Silinen değerin değeri: 3

2. Dictionary Elemanlarını Gezme

Dictionary üzerinde gezinti yapmak için for döngüsü kullanılabilir.

a. Anahtarları Gezme

Anahtarları iterasyonla dolaşarak işlemler yapabilirsiniz.

my_dict = {"apple": 3, "banana": 2, "cherry": 5}
for key in my_dict:
print(key)
# Çıktı: apple, banana, cherry (her satırda bir anahtar)

b. Değerleri Gezme

values() metodu ile değerleri dolaşabilirsiniz.

for value in my_dict.values():
print(value)
# Çıktı: 3, 2, 5 (her satırda bir değer)

3. Dictionary İndeks Kullanarak Gezme

Python dictionary veri yapısında indeks kavramı doğrudan yoktur, ancak anahtar-değer çiftlerini belirli bir sıra ile dolaşabilirsiniz.

keys = list(my_dict.keys())
for i in range(len(keys)):
key = keys[i]
print(f"Index {i}: {key} -> {my_dict[key]}")
# Çıktı:
# Index 0: apple -> 3
# Index 1: banana -> 2
# Index 2: cherry -> 5

4. Dictionary’de Bir Anahtarın Varlığını Kontrol Etme

Dictionary’de bir anahtarın olup olmadığını kontrol etmek için in anahtar kelimesi kullanılabilir.

my_dict = {"apple": 3, "banana": 2, "cherry": 5}
# 'banana' anahtarının varlığını kontrol etme
if "banana" in my_dict:
print("banana anahtarı sözlükte mevcut.")
else:
print("banana anahtarı sözlükte mevcut değil.")
# 'grape' anahtarının varlığını kontrol etme
if "grape" not in my_dict:
print("grape anahtarı sözlükte mevcut değil.")
# Çıktı:
# banana anahtarı sözlükte mevcut.
# grape anahtarı sözlükte mevcut değil.

5. items() Fonksiyonunun Kullanımı

items() metodu, dictionary içindeki anahtar-değer çiftlerini bir tuple olarak döner.

for key, value in my_dict.items():
print(f"{key}: {value}")
# Çıktı:
# apple: 3
# banana: 2
# cherry: 5

a. Başlangıç İndeksini Belirleyerek Gezme

Anahtar-değer çiftlerini enumerate ile birlikte kullanarak gezinebilirsiniz.

for index, (key, value) in enumerate(my_dict.items(), start=1):
print(f"Index {index}: {key} -> {value}")
# Çıktı:
# Index 1: apple -> 3
# Index 2: banana -> 2
# Index 3: cherry -> 5

6. Dictionary İşlemlerinin Zaman ve Bellek Karmaşıklıkları

Python’daki dictionary veri yapısı, hash tabanlı bir yapı olduğundan çoğu işlem ortalama O(1) zaman karmaşıklığına sahiptir. Ancak en kötü durum karmaşıklığı O(n) olabilir.

Zaman Karmaşıklığı

  • Ekleme (Atama): O(1) amortize, O(n) en kötü durum (hash çakışması veya yeniden boyutlandırma gerekirse)
  • Silme (del, pop()): O(1) amortize, O(n) en kötü durum
  • Okuma (Anahtara göre değer okuma): O(1) amortize, O(n) en kötü durum
  • Yazma (Anahtara göre değer yazma): O(1) amortize, O(n) en kötü durum
  • Anahtarın varlığını kontrol etme (in): O(1) amortize, O(n) en kötü durum

Yer (bellek) karmaşıklığı

Python dictionary, eklenen her anahtar-değer çifti için hash tablosunda bir giriş tutar. Bu nedenle bellek kullanımı, eleman sayısına ve anahtarların hash tablosundaki dağılımına bağlı olarak değişir. O(n) olarak kabul edilebilir.

Sonuç

Bu makalede, Python’da dictionary veri yapısında eleman atama, elemanları gezme, indeks kullanarak dolaşma, bir anahtarın varlığını kontrol etme ve items() fonksiyonunun nasıl kullanılacağı üzerinde duruldu. Dictionary, anahtar-değer çiftleriyle çalışmayı kolaylaştıran ve Python programlamada sıkça kullanılan güçlü bir veri yapısıdır.

Python Veri Yapıları - Diziler

Python’da Dizi Veri Yapısı:

Bu makalede listelere birden fazla yöntemle eleman atama, liste elemanlarını gezme ve enumerate fonksiyonunu kullanma konularını adım adım ele alacağız:

  1. Diziye Eleman Atama
  2. Dizi Elemanlarını İterasyonla Gezme
  3. Dizi İndekslerini Kullanarak Gezme
  4. enumerate Fonksiyonunun Kullanımı

1. Diziye Eleman Atama

Diziye eleman atama işlemi, belirli bir indekse değer atama veya yeni eleman ekleme/silme şeklinde olabilir.

a. Belirli Bir İndekse Eleman Atama

Bir dizinin belirli bir indeksine yeni bir değer atayarak mevcut değeri güncelleyebilirsiniz.

arr = [10, 20, 30, 40]
arr[1] = 25 # 1. indeksteki 20 değeri 25 olarak güncellenir
print(arr) # Çıktı: [10, 25, 30, 40]

b. Yeni Eleman Ekleme

Listeye eleman eklemek için append veya insert metotları kullanılabilir.

# Listeye sona eleman ekleme
arr.append(50)
print(arr) # Çıktı: [10, 25, 30, 40, 50]
# Belirli bir indekse eleman ekleme
arr.insert(2, 35)
print(arr) # Çıktı: [10, 25, 35, 30, 40, 50]

c. Eleman Silme

pop metodu ile belirli bir indeksteki eleman silinebilir veya remove metodu ile belirtilen değer listeden çıkarılabilir.

# İndekse göre eleman silme
arr.pop(2) # 2. indeksdeki 35 değeri silinir
print(arr) # Çıktı: [10, 25, 30, 40, 50]
# Değere göre eleman silme
arr.remove(40)
print(arr) # Çıktı: [10, 25, 30, 50]

2. Dizi Elemanlarını İterasyonla Gezme

Liste elemanlarını gezmek için for döngüsü sıkça kullanılır.

a. Doğrudan Eleman Gezme

Listede elemanları doğrudan gezerek işlemler yapabilirsiniz.

arr = [10, 20, 30, 40, 50]
for num in arr:
print(num)
# Çıktı: 10, 20, 30, 40, 50 (her satırda bir sayı)

b. Elemanların Toplamını Bulma

Dizi elemanlarını iterasyonla gezerken başka işlemler de yapabilirsiniz, örneğin toplamını hesaplama:

total = 0
for num in arr:
total += num
print("Toplam:", total) # Çıktı: Toplam: 150

3. Dizi İndekslerini Kullanarak Gezme

Listeyi iterasyonla gezerken indeksi kullanmanız gerekebilir. Bunu range fonksiyonuyla yapabilirsiniz.

arr = [10, 20, 30, 40, 50]
for i in range(len(arr)):
print(f"Index {i}: {arr[i]}")
# Çıktı:
# Index 0: 10
# Index 1: 20
# Index 2: 30
# Index 3: 40
# Index 4: 50

Bu yöntem, hem indeks hem de değer üzerinde işlem yapmak gerektiğinde kullanışlıdır.

4. enumerate Fonksiyonunun Kullanımı

enumerate fonksiyonu, bir listeyi iterasyonla gezerken her elemanın indeksini ve değerini aynı anda elde etmeyi sağlar.

arr = [10, 20, 30, 40, 50]
for index, value in enumerate(arr):
print(f"Index {index}: {value}")
# Çıktı:
# Index 0: 10
# Index 1: 20
# Index 2: 30
# Index 3: 40
# Index 4: 50

Bu yöntem, indeks ve değerin aynı anda gerekli olduğu durumlarda hem daha okunabilir hem de daha Pythonic bir çözümdür.

a. Başlangıç İndeksini Belirleme

enumerate fonksiyonuna ikinci bir argüman vererek başlangıç indeksini belirleyebilirsiniz.

for index, value in enumerate(arr, start=1):
print(f"Index {index}: {value}")
# Çıktı:
# Index 1: 10
# Index 2: 20
# Index 3: 30
# Index 4: 40
# Index 5: 50

Sonuç

Bu makalede, Python’da dizilere eleman atama, dizi elemanlarını iterasyonla gezme, indeksleri kullanarak gezme ve enumerate fonksiyonunun nasıl kullanılacağı üzerinde duruldu. Bu temel işlemler, dizilerle etkili bir şekilde çalışmak için önemli olup, Python programlamada sıkça karşımıza çıkar.