Fonksiyonu lambda olarak yazmak

Forum sayesinde ben de lambda kullanmaya başlamak istedim. Otomatik bulmaca hazırlayan bir program yazmaya başladım.

class Kelime():
    karakterler = list("abcçdefgğhıijklmnoöprsştuüzvyz1234567890- ")
    kelimeler = []
    def __init__(self,kelime):
        Kelime.kelimeler+=kelime
        ###################################
        self.kelime = kelime
        self.ayristirilmis = {}
        ###################################
        self._ayristir()
    
    def _ayristir(self): #Kelimenin içinde bulunan harfleri bul.
        for i in list(self.kelime):
            for j in Kelime.karakterler:
                if (i == j):
                    if (i in self.ayristirilmis):
                        self.ayristirilmis[i] = self.ayristirilmis[i]+1
                    else:
                        self.ayristirilmis[i] = 1
                    
            

class Bulmaca():
    def __init__(self,kelimelistesi):
        self.kelimelistesi = kelimelistesi
        self.kelimeler = []
        ####################################
        self.olustur()


    def olustur(self):
        self.kelimeler += [Kelime(i) for i in self.kelimelistesi]
        print(self.kelimeler)




k = ["merhaba","ahali","elma"]
Bulmaca(k)

_ayristirfonksiyonunu lambda olarak yazmak istiyorum birkaç deneme yaptım ama sanırım bilmem gereken fazladan şeyler var.

Ayrıştır fonksiyonuyla tam olarak ne yapmaya çalışıyorsunuz? Kodlar biraz tuhaf geldi de.

Verilen kelimenin içindeki harfleri teke indirmeye çalışıyorum. Örneğin araba kelimesi verildiği zaman a r b çıktısını istiyorum. Kümeleri kullanmam daha doğru olabilir galiba.

map(self.ayristirilmis.add,[i for i in self.kelime])
print(self.ayristirilmis)

şeklinde bir şey denedim ama sonuç alamadım.

O halde set kullanabilirsiniz,

>>> set('araba')
{'a', 'b', 'r'}
class set(object)
 |  set() -> new empty set object
 |  set(iterable) -> new set object
 |
 |  Build an unordered collection of unique elements.
class Kelime():
    karakterler = list("abcçdefgğhıijklmnoöprsştuüzvyz1234567890- ")
    kelimeler = []
    def __init__(self,kelime):
        Kelime.kelimeler+=kelime.lower()
        ###################################
        self.kelime = kelime.lower()
        self.ayristirilmis = set(self.kelime)
        ##################################

sınıf bu şekilde güncelledim. İstediğim şeyi yapıyor.
Ama map(self.ayristirilmis.add,[i for i in self.kelime]) neden çalışmıyor?

(...)
        self.ayristirilmis = {}
(...)

map(self.ayristirilmis.add,[i for i in self.kelime])

self.ayristirilmis varsayılan olarak dict şeklinde tanımlanıyor, dict objesinin add isminde bir fonksiyonu yok, eğer self.ayristirilmis = set() şeklinde tanımlarsanız çalışacaktır kodunuz.

map(self.ayristirilmis.add, self.kelimeler) de iş görür bu arada, sonuçta self.kelimeler de bir iterable.

Cunku map tembel. Fonksiyonel programlama yaparken yan etkili fonksiyonlar kullanilmamali; self.ayristirilmis.add sadece yan etkisi icin kullanildigi icin sonucu ve haliyle map'in sonucu kullanilmamis. list(map(...)) calisiyor.

[i for i in self.kelime] ile self.kelime'nin hic bir farki olmamasi lazim. Bu kodda olmadigi kesin.


Bu arada ayristirmanin amaci bazi harfleri ayiklamak oldugu icin her elemani baska bir elemana ceviren map fonksiyonu bu is icin uygun degil. Dogrusu reduce:

import functools as ft

ayristir = lambda kelime: ft.reduce(lambda harfler, harf: harfler if harf in harfler else harfler + [harf], kelime, [])
#ayristir = lambda kelime: ft.reduce(lambda hs, h: hs if h in hs else hs + [h], kelime, [])

print(ayristir("araba"))

Python’in ters if'inden tekrar tiksindim.

1 Like

Şu da olur:

def reduce(string):
    return [item
            for index, item in enumerate(string)
            if all(not previous.startswith(item)
                   and not item.startswith(previous)
                   for previous in string[:index]
                   )
            ]


print(reduce("araba"))
1 Like

Ters if ne oluyor?

Conditional Expressions

1 Like