Listeden kelime arama

aşağıda girdiğim kodlarda tanımladığım yerlesimYerleri listesinden *bolu* olarak arama yaptırdığımda hiçbir çıktı alamıyorum. Yanlışım nerede. Yardımcı olursanız sevinirim.



def ara(kelime,altkelime):
    if altkelime[-1]=='*':
        kucuk=kelime.lower()
        if kucuk.startswith(altkelime[:-1].lower()):
            return kelime
    elif altkelime[0]=='*' and altkelime[-1]=='*':
        kucuk=kelime.lower()
        if kucuk.find(altkelime[1:-1].lower()):
            return kelime
    elif altkelime[0]=='*':
        kucuk=kelime.lower()
        if kucuk.endswith(altkelime[1:].lower()):
            return kelime
    else:
        if kelime==altkelime:
            return kelime
def bul(altkelime):
    for u in yerlesimYerleri:
        r=ara(u,altkelime)
        if r:
            print\(r\)
aranacakKelime=input('Aramak istediğimiz yerleşim Yeri:')
bul(aranacakKelime)
       
1 Beğeni

selamlar,
aşağıdaki yazıda kodlarınızı nasıl paylaşacağınız anlatılmış, düzeltebilirseniz daha kolay yardımcı olunabilir.

Hata yerlesimYerleri listesinin tanimli olmamasi:

09:23:57 1 aib@apollon:/tmp% python3 a.py
Aramak istediğimiz yerleşim Yeri:bolu
Traceback (most recent call last):
  File "a.py", line 25, in <module>
    bul(aranacakKelime)
  File "a.py", line 20, in bul
    for u in yerlesimYerleri:
NameError: name 'yerlesimYerleri' is not defined
1 Beğeni

Kodu eksik yazmışım. Tam kodlar aşağıdaki gibidir.

yerlesimYerleri=['Bolu','Yozgat','inebolu','Manavgat','Çanakkale','Çan','Kırıkkale','Tirebolucuk']

def ara(kelime,altkelime):
    if altkelime[-1]=='*':
        kucuk=kelime.lower()
        if kucuk.startswith(altkelime[:-1].lower()):
            return kelime
    elif altkelime[0]=='*' and altkelime[-1]=='*':
        kucuk=kelime.lower()
        if kucuk.find(altkelime[1:-1].lower()):
            return kelime
    elif altkelime[0]=='*':
        kucuk=kelime.lower()
        if kucuk.endswith(altkelime[1:].lower()):
            return kelime
    else:
        if kelime==altkelime:
            return kelime
def bul(altkelime):
    for u in yerlesimYerleri:
        r=ara(u,altkelime)
        if r:
            print(r)
aranacakKelime=input('Aramak istediğimiz yerleşim Yeri:')
bul(aranacakKelime)

Once altkelime * ile bitiyor mu diye bakiyor, sonra altkelime * ile basliyor ve * ile bitiyor mu diye bakiyor. Ilk elif'e dusmesi icin altkelimenin * ile bitmemesi lazim, kendisi de tam olarak bunu test ettigi icin ilk elif asla calismiyor.

Bu arada:

Kendi ve sana yardim etmeye calisan insanlarin isini kolaylastirmak adina su sekilde test case’leri yazmanda fayda var:

assert(ara("Bolu", "bolu") == "Bolu")
assert(ara("Yozgat", "bolu") == None)
assert(ara("Bolu", "bol*") == "Bolu")
assert(ara("Bolu", "*olu") == "Bolu")
assert(ara("Inebolu", "*olu") == "Inebolu")

ara fonksiyonunun da ismi ve dondurdugu deger yanlis sanki; iki kelime eslestirdigi icin eslestir adini verip, durumda gore True veya False dondururdum ben olsam.

Kodları aşağıdaki gibi düzenleyince sorun çözüldü. @aib acemiyim henüz Mustafa Başer’in Python kitabından çalışıyorum bölüm bölüm sırayla gidiyorum yanlış ve eksiklerim için kusura bakma.



def ara(kelime,altkelime):
    
    if altkelime[0]=='*' and altkelime[-1]=='*':
        kucuk=kelime.lower()
        if kucuk.find(altkelime[1:-1].lower())  :
            return kelime
    elif altkelime[-1]=='*':
        kucuk=kelime.lower()
        if kucuk.startswith(altkelime[:-1].lower()):
            return kelime
    elif altkelime[0]=='*':
        kucuk=kelime.lower()
        if kucuk.endswith(altkelime[1:].lower()):
            return kelime
    else:
        if kelime==altkelime:
            return kelime
def bul(altkelime):
    for u in yerlesimYerleri:
        r=ara(u,altkelime)
        if r:
            print(r)
aranacakKelime=input('Aramak istediğimiz yerleşim Yeri:')
bul(aranacakKelime)
       

Niye bakayim, burasi acemilerin cogunlukta oldugu (en azindan baslik sayisi olarak) bir forum.

Fakat ara fonksiyonu, isim ve parametre sekli olarak, kitaptan degil, degil mi?
Cunku dedigim sekilde basitlestirilmesinde buyuk fayda var.

Bu arada kelimede * yoksa lower cagirmiyorsun. (Yazdigim testlerin ilkinin yakaladigi durum)