Listenin permutasyonlarini siralama

Mesela bunu basitlestirelim:

En karmasik yer for loop’u. (Okuyarak anlamadim, calistirip bakmam gerekti ne yaptigina. + operatoru Python’da bir suru farkli is yapiyor cunku.)

i ve range kullanmamizin sebebi indise ve bir araliga ihtiyacimiz olmasi mi? Hayir, bunlar yapmak istedigimizi tane tane ifade etme aliskanligindan geliyor. Aslinda istedigimiz ardisik ciftler. itertools’a bakiyoruz:

import itertools

def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = itertools.tee(iterable)
    next(b, None)
    return zip(a, b)

Kodda:

def pascal(n):
    if n == 1:
        return [1]
    else:
        SAT = [1]
        ON_SAT = pascal(n-1)
        for a, b in pairwise(ON_SAT):
            SAT.append(a + b)
        SAT += [1]
    return SAT

ON_SAT’a da ihtiyac kalmadi:

def pascal(n):
    if n == 1:
        return [1]
    else:
        SAT = [1]
        for a, b in pairwise(pascal(n-1)):
            SAT.append(a + b)
        SAT += [1]
    return SAT

Peki SAT’in hakikaten hayatina [1] olarak baslayip, yavas yavas buyumesine ihtiyacimiz var mi? Hayir, basinda ve sonunda 1 olan ve arada ciftlerin toplami olan bir liste istiyoruz:

def pascal(n):
    if n == 1:
        return [1]
    else:
        SAT = [1] + [a+b for a, b in pairwise(pascal(n-1))] + [1]
    return SAT

Degiskene de ihtiyac yok:

def pascal(n):
    if n == 1:
        return [1]
    else:
        return [1] + [a+b for a, b in pairwise(pascal(n-1))] + [1]

Birden fazla return’e de:

def pascal(n):
    return ([1]) if (n == 1) else ([1] + [a+b for a, b in pairwise(pascal(n-1))] + [1])

Sonra lambda’lastirmak istersek:

pascal = lambda n: ([1]) if (n == 1) else ([1] + [a+b for a, b in pairwise(pascal(n-1))] + [1])
2 Beğeni