Listenin içerisindeki kelimelerden verilen kelimeye en çok benzeyenini ekrana yazdıran program

Tanımlanan bir listenin içerisinden verilen kelimeye en çok benzeyenini ekrana yazdırmak istiyorum. Ortak harf sayısına göre yapmayı düşünüyorum. Mesela;
veri=[“furkan”,“yazbel”]
def didyoumean(kelime):
pass
print(didyoumean(“gurkan”))

çıktı olarak “furkan” vermelidir. Nasıl yapabilirim?

1 Beğeni

Benzemekten kasin nedir?

Furkan'a Gurkan mi daha cok yakin yoksa Fµrkan mi? Yoksa urkanF mi?

2 Beğeni

Listenin içerisinde bulunan gurkan’a en çok benzeyen kelime furkan olduğu için furkan yazdırmalı. Mesela yazgel yazdığımda listenin içerisinde en çok benzeyen yazbel olduğu için “yazbel” çıktısı vermeli

İyi ancak listeniz daha uzun olduğunda, mesela içinde hem bal hem de kal kelimesi bulunursa al yazdığımızda bize ne çıktı verecek? Algoritmayı oluşturmadan önce ne yapacağımızı kesin olarak belirlemeliyiz.

Listenin içerisinde öyle bir şey bulundurmayacağım için çok bir sorun olmaz diye düşünüyorum.

O zaman benzerini bulduğu ilk kelimeyi döndürecek şekilde bir yol izleyeceğiz.

Her kelime için illa ki bir benzer bulacak mı? Mesela ben ahmet yazdığımda bana furkanyazbel mi diyecek yoksa hiçbir çıktı vermeyecek mi?

İlk kelimeyi değil de en çok benzer harf bulunduranı yazdıracak dışarıdan verilecek olan input listenin içerisindekiler ile benzer olacak ya da aynısı olacak. Aynısı olduğunda direk yazdıracak farklı olduğunda listenin içerisinde tarayıp en çok ortak harfi bulunduran kelimeyi yazdırması gerekiyor

İşte burada yine benim dediğime geliyoruz. İki kelime ile aynı sayıda harf benzerliğine sahip ise ne yazdıracağız.

Bu dediğiniz biraz zor. Ben a şeklinde bir girdi girersem ne olacak? Hem furkanda hem de yazbelde bir defa bulunuyor.

Eğer ortak harf sayısı aynı ise sizin dediğiniz gibi ilkini yazdırabilir

1 Beğeni

Bu kod istediğiniz gibi çalışıyor mu acaba:

liste = ["furkan", "yazbel"]

##girdi = "gurkan"
girdi = input(" > ")


def benzerliği_bul(girdi,kelime):
    benzerlik = []
    for sıra, harf in enumerate(girdi):
        sayaç = 0
        if harf in kelime:
            benzerlik.append(1)
            index = kelime.index(harf)
            sayaç += 1
            try:
                while kelime[index+sayaç] == girdi[sıra+sayaç]:
                    sayaç += 1
                    benzerlik[-1] += 1
            except IndexError:
                pass
    if len(benzerlik) == 0: return 0
    return max(benzerlik) 
            
benzerlik = {}
for kelime in liste:
    b = benzerliği_bul(girdi, kelime)
    if b > 0:
        benzerlik[kelime] = b

if len(benzerlik) == 0:
    print("Benzer bir kelime bulunamadı.")
else:
    print(max(benzerlik, key= lambda x: benzerlik[x]))

Maalesef bu kod ödevimin bir parçası olacağı için max, enumerate,index ve sözlük yapısı kullanmam yasak. Bu komutları kullanmadan yapmam gerekiyor. Fakat kod çok güzel çalışıyor elinize sağlık teşekkür ederim

Builtin fonksiyonları işinizi görecek kadarı ile kendiniz de yazabilirsiniz ancak sözlüksüz yapmak için saçma bir indexleme karmaşasına girmeniz gerekiyor.

Şu kodlar işinizi görür mü acaba? Burada girilen kelimedeki harf sayısı listedeki hangi kelimede fazla geçiyorsa o ekrana yazdırılır. Eğer harf sayısı iki kelimede de eşitse, ikisi de ekrana yazdırılır.

liste = ["furkan", "yazbel"]


def find_similars(word):
    counts = {}
    for i in liste:
        count = 0
        for j in i:
            if j in word:
                count += 1
        counts[i] = count
    for keys, values in counts.items():
        if counts[keys] == max(counts.values()):
            print(keys)


find_similars("fasep")

# Çıktı:
# furkan
# yazbel
2 Beğeni

Bunu niye simdi, kodu zaten yazdiktan sonra ogrendik?

Ikinci, ucuncu kere yazdiktan sonra neler ogrenecegiz?

Hangi noktada -muhtemelen hala aciklayamadigin benzerlik algormasini da aciklayan- tam odev metnini gorecegiz?

2 Beğeni

Sadece harf sayısına bakmak çok sağlıklı bir yöntem değil bence. Harflerin yeri de önemli.

Ama ortak harf sayısına göre yapmayı düşündüğünü söyledi.

Çok özür dilerim haklısınız başta söylemeliydim. Yaptıklarınız için çok teşekkür ederim

Yani o da doğru.

Keşke siz de öğretmeninizden @aib’in ve bizim sizden beklediğimiz gibi tam bir tanım alsaydınız. Sözlük kullanamam diyorsunuz, ki bence son derece önemli bir veri türü. Algoritmayı çok kolaylaştırıyor. Madem hocanız buna bile izin vermedi benimki kadar karmaşık bir algoritmaya ihtiyacınız yok. Ödeviniz için @dildeolupbiten’in kodu işinizi görecektir. (Aslında onda da sözlük var…)

Yani sözlük kullanabiliyorken, “sözlük kullanmayın” demek biraz ne bileyim tuhaf oluyor. sözlük yerine [("x", 1)] gibi bir veri de kullanabilirsiniz, ama bu satır sayısını arttırır. max fonksiyonuyla aynı işlemi yapan başka bir fonksiyon da tanımlayabilirsiniz tabi. Ama zaten tanımlanmışı varken niye max'ı kullanmayın diyor hocanız onu anlamadım. Acaba builtin fonksiyonlardan uzak durmaya çalışmanızı ve onlara benzer fonksiyonları oluşturmanızı mı istiyor hocanız?

1 Beğeni

Dediğiniz gibi [("x", 1)] şeklinde bir şey de kullanılabilir ancak bu sefer indexleme işlemleri uzuyor ve verimsizleşiyor. Ödevin de çok basit bir algoritma olmaması sözlük kullanmanın yasak olmasını ilginçleştirmiş. Sözlükleri öğretmeden fonksiyonların öğretilmesi de ilginç bence.