Akademisyenler öncülüğünde matematik/fizik/bilgisayar bilimleri soru cevap platformu
0 beğenilme 0 beğenilmeme
806 kez görüntülendi

Python'da bir dize (string) için karakterleri indexleyen bir fonksiyon vardır. string.index(x) biçiminde çalışıyor. Örneğin:

dize = "xxyzzx"

liste = []
for a in dize:
  liste.append(dize.index(a))
print(liste)

çıktımız:

[0, 0, 2, 3, 3, 0]

şeklinde görünür. Aslında bu index fonksiyonunu da çok beğenmedim. Çünkü çıktının

[0, 0, 1, 2, 2, 0]

biçiminde gelmesi daha mantıklı olurdu. Her farklı harf için sırasıyla $0,1,2, \dots $ biçiminde indeksleme yapmak istiyorum. Temel Python kodları kullanarak böyle bir index fonksiyonunu nasıl yazabiliriz?

Veri Bilimi kategorisinde (2.6k puan) tarafından  | 806 kez görüntülendi
Python bilmiyorum ama tek yapmaniz gereken cikan arrayden 1 cikartip negatifleri takrar sifir yapmak. ReLu([0, 0, 2, 3, 3, 0]-1) isinize yarar. ReLu=Ramp fonksiyonuna bakabilirsiniz pythonda.

1 cevap

1 beğenilme 0 beğenilmeme
En İyi Cevap
import numpy as np 
def relu(x):
    return(np.maximum(0,x))
dize = "xxyzzxxzy"

lst = []
for a in dize:
  lst.append(dize.index(a))
newlst=relu(np.array(lst)-1)

print(newlst) 

[0 0 1 2 2 0 0 2 1]

pythonca mi bilmiyorum ama bu ise yariyor. Daha kisa bi yolu olabilir..

Daha kisasi  surda var.

import pandas as pd
dize = "xxyzzxxzy"
lst=[*dize]
numbers = pd.factorize(lst)[0]
print(numbers)

[0 0 1 2 2 0 0 2 1]

 

(2.9k puan) tarafından 
tarafından seçilmiş

Teşekkürler Ökkeş bey. Verdiğiniz bağlantıdaki 

def your_function(list_of_strings):

    encountered_strings = {}
    result = []

    idx = 0
    for astring in list_of_strings:
        if astring in encountered_strings:  # check if you already seen this string
            result.append(encountered_strings[astring])
        else:
            encountered_strings[astring] = idx
            result.append(idx)
            idx += 1
    return result

çözümü tam olarak aradığım şeydi. Çözümde, dizedeki farklı harfleri anahtar kabul eden bir sözlük-dictionary (sözlükler, özel bir tür küme yapısıdır) tanımlanıyor, bu anahtarlara $0, 1, 2, \dots$ gibi sayılar karşılık getiriliyor. Bunlar bizim indekslerimiz oluyor. "result" isimli liste yapısı ise dizedeki harflerin indekslerini üretiyor.

 

Bu kod parçacığı ile aşağı yukarı aynı görevi yapan ve bizim için kolaylık olsun diye hazırlanmış dize.index() fonksiyonunu neden tercih etmediğimi sohbet ederek açayım. Bazı görevlerde, örneğin bir sınavda ya da bir iş mülakatında code challenge diye tabir edilen aşamalar olabiliyor. Burada sınavı/mülakatı yapan kişiler genelde sizden bir library'den özel bir fonksiyon import etme (çağırma, ithal etme) işlemi yapmadan temel kodları kullanarak problemi çözmenizi bekliyor. Ya da temel kodlardan bazılarının kullanımı yasaklanıyor ve sizden görevi bu şekilde tamamlananız isteniyor. "İndex fonksiyonunu kullanmadan kod yazın" gibi bir kısıtlama gelmesi zordur diye tahmin ediyorum. Çünkü index fonksiyonu, append fonksiyonu, list, ... bunlar çok temel fonksiyonlar.

 

Zorluk ve uzunluk olarak yukarıdakine denk bir kodlama problemi, kodlama gerektiren bir sektörde başvurulan pozisyona göre code challenge için uygun bir düzeyde olabilir. Örneğin; senior düzey veri bilimcisi pozisyonu için bu düzeyde soru tercih edilebilirken, senior düzey python engineer posizyonu için hafif olabilir, belki entry düzey engineer için bile hafif olabilir. (Bilgisayar mühendislerinin veya sektörden kişilerin problemin zorluk düzeyi seçimini yorumlaması daha sağlıklı olur. Nette denk geldiğim birkaç code challenge sorusu oldu ama ilgili arkadaşları yanlış yönlendirmek istemem. Merak edenlerin, bu tür soruların/deneyimlerin paylaşıldığı sitelerde zaman harcamasını tavsiye edebilirim.)

 

İşi aldık diyelim, kullanacağımız bir library'yi baştan kodlayacak değiliz. En hızlı şekilde işleri teslim etmeye bakarız, işverenin beklentisi de öyle olur. Sanırım code challenge aşamasındaki önemli bir amaç şudur: umulmadık bir problem çıktığı zaman kişi yaratıcı çözümler geliştirebiliyor mu? Çözümünü internette bulamadığı/internete sormasının da pek uygun olmayacağı bir sorunla karşılaştığında, kişi kendi kodlarını yazarak o sorunu aşabilecek dirençte midir?

 

İndeks fonksiyonu sorusu nereden aklıma geldi, onu da paylaşayım. codewars isimli sitede kyu 6-düzey bir problemi çözüyordum. (Kyu 8 en kolay, kyu 1 düzey en zor olarak sıralanmıştır.) İndeks fonksiyonu yazarsam soruyu çözebileceğimi farkettim. İndeks fonksiyonunu tam olarak yazamasam da sitenin tüm testlerinden geçecek brutal bir başka kod dizisi yazıp görevi tamamladım. Kimi kurumlar, code challenge için bu tür kod problemleri sunan (yine hackerrank gibi) sitelerin sorularından faydalanmayı, onları modifiye etmeyi tercih edebiliyor. Bu bakımdan, meraklıları veya Python kodlama becerilerini iş hayatında kullanacak kişiler de bu tür sitelerdeki problemlerle vakit geçiriyor. 

 

Benim uğraştığım kyu 6-düzey soruyu da bir başka başlıkta paylaşırım. (... ve iki-kelimenin-izomorf-olup-olmadigini-kontrol-python-programi başlığında paylaştım.)

 

20,279 soru
21,810 cevap
73,492 yorum
2,475,384 kullanıcı