Salı, Kasım 24, 2020

Az Bilinen Fakat İhtiyaca Göre Çok Kullanışlı Python Veri Yapıları

Python programlama dili, kullanım kolaylığı açısından kuşkusuz son zamanların en çok kullanılan programlama dillerinden biri olmuştur. Farklı alanlarla ilgili çeşitli sorunlar için sıfırdan kod geliştirme yükünü büyük ölçüde azaltabilecek bir dizi standart kütüphane sağlar. Bu yazımızda pek çok kişi tarafından az bilinen fakat ihtiyaca göre çok kullanışlı Python veri yapıları ile en yaygın sorunların bazılarına çözüm bulacağız.

1. Bir liste, tuple veya NumPy arraydeki en büyük ya da en küçük sayıyı bulma

Gerçek dünya problemlerinde birçok durumda bir koleksiyondaki en büyük ya da en küçük ögeleri bulmamız gerekebilir. Python programlama dilinin içerisinde bulunan heapq modülü bir koleksiyondaki en büyük ya da en küçük ögeleri çıkartmamıza yardım eder.

  • nlargest(n, iterable) ve nsmallest(n, iterable) methodları bu işlem için kullanılır. “n” parametresi burada çıkarılacak en büyük ya da en küçük ögelerin sayısıdır. “iterable” parametresi ise bir liste, demet ya da dizi olmalıdır.
import numpy as np (eğer yüklü değilse terminali açıp pip install numpy yazıp yükleyebilirsiniz.)
import heapq

#Burada bir liste, tuple ve array tanımlayacağım.

birliste = list(range(0,100)
birtuple = tuple(range(-500,500,2))
birarray = np.arange(-100,100,1)

# Daha sonra nlargest methodunu kullanarak en büyük 4 elemanı ekrana yazdırıyoruz.
print(heapq.nlargest(4,birliste))
print(heapq.nlargest(4,birtuple))
print(heapq.nlargest(4,birarray))

#Beklenen çıktı:
[99,98,97,96]
[498,496,494,492]
[99,98,97,96]

#nsmallest methodunu kullanarak aynı şekilde en küçük 5 elemanı ekrana yazdırıyoruz.

print(heapq.nsmallest(5, birliste))
print(heapq.nsmallest(5, birtuple))
print(heapq.nsmallest(5, birarray))

#Beklenen çıktı
[1,2,3,4,5]
[-500,-498,-496,-494,-492]
[-100,-99,-98,-97,-96]

Bir koleksiyonda birden fazla en büyük veya en küçük ögeye ihtiyaç duyulması durumunda bu yöntemler daha hızlı ve etkilidir. Ancak bir koleksiyondaki en büyük ve en küçük tek bir öge gerekliyse o zaman min, max methodları çok daha verimlidir. Ve koleksiyonunu türüne bakılmaksızın (liste, tuple, array) her zaman sonuç bir liste şeklinde dönüyor olacaktır.

2. Bir koleksiyondaki en yaygın elemanı ve oluşum sayısı

Bazen, bir koleksiyon içerisindeki en yaygın N elemanı bulmak isteyebiliriz. Counter kütüphanesi bir listede veya bir numpy dizisindeki en yaygın elemanı ve o elemanın ortaya çıkma sayısını bulabilecek most_common adlı bir yönteme sahiptir.

import numpy as np
from collections import Counter

# Bir numPy dizisi oluşturuyoruz ve bu diziyi Counter sınıfına dönüştürüyoruz.

birarray = np.random.randint(0,10,30)
print(birarray)
birarray = Counter(birarray)

#Beklenen çıktı:
[1 1 0 8 1 1 8 1 4 5 3 5 9 9 0 1 7 4 0 3 2 3 8 6 2 9 7 4 5 6]

#Dizide bulunma sayısına göre en yaygın iki elemanı ekrana yazdırabiliriz.
birarray.most_common(2)
[(1,6), (0,3)]

most_common methodu argüman olarak bulmak istediğim en yaygın eleman sayısını kabul eder. Sonuç olarak bunları bir tuple olarak bize döndürür. Burada sonuca baktığımızda, dizi içerisindeki 1 sayısı 6 kez, 0 sayısı ise 3 kez gözükmüştür.

3. Tablo Kategroizasyonu: Bir diziyi ikiye bölme

Bazen veriyi belirli noktalara göre bölmek isteyebiliriz. bisect modülünün bisect methodu bu görevi halletmek için mükemmel bir araçtır. 00 üzerinden 10 öğrencinin puanlarını düşünün. Puanlarının 25’in altında, 25 ile 50 arasında, 50 ile 75 arasında veya 75’in üzerinde olmasına göre onları 4 sınıfa yerleştirmemiz gerekiyor. Bu şu şekilde yapılabilir.

import numpy as np
from bisect import bisect

kesim_noktalari = [25,50,75]
sınıflar = ['25 altı', '25 ile 50 arası', '50 ile 75 arası', '75 ve üzeri']
puanlar = np.random.randint(0,100,10)
print(puanlar)

#Beklenen çıktı:
array([83, 71, 86, 98, 61, 39, 72, 96, 84, 24])

[sınıflar[bisect(kesim_noktalari,score) for score in scores]
#Beklenen çıktı:

['75 ve üstü',
'50 ile 75 arası',
'75 ve üstü',
'75 ve üstü',
'50 ile 75 arası',
'25 ile 50 arası',
'50 ile 75 arası',
'75 ve üstü'
'75 ve üstü',
'25 altı']

Bugün En Çok Okunanlar

CEVAP VER

Lütfen yorumunuzu giriniz!
Lütfen adınızı buraya girin