osa1 feed

Python'da circular list

February 12, 2011 - Tagged as: python, tr.

Son dönem aramda Land of Lisp okumaya başlamıştım, bu sabah biraz daha kurcalayayım dedim ve common lisp’deki circular list olayını öğrendim.

Kısaca, listenin son hücresinin cdrının listenin carını gösterdiği liste. Bu durumda örneğin liste 3 elemanlıysa, 4. eleman listenin 1. elemanını ve 5. eleman listenin 2. elemanını gösteriyor.

Hazır Python’da magic methodları yeni yeni kullanmaya başlamışken, bu Python’da nasıl olur diye düşündüm. Şu şekilde basit bir CircularList sınıfı oluşturabildim:

class CircularList():
    def __init__(self, *args):
        self.members = list(args)
        
    def __getitem__(self, member):
        return self.members[member % len(self.members)]

    def __setitem__(self, member, value):
        self.members[member] = value
        return value

    def __delitem__(self, member):
        return self.members.remove(member)

    def __len__(self):
        return len(self.members)

    def __contains__(self, item):
        return item in self.members

    def __iter__(self):
        i = 0
        while True:
            yield self.members[i]
            i += 1
            if i >= len(self.members):
                i = 0

    def __repr__(self):
        s = str(self.members)
        return s.split(']')[^0]+ ', ...]'

    def append(self, value):
        self.members.append(value)

    def remove(self, value):
        self.members.remove(value)

Birkaç test:

>>> cl = CircularList(1, 3, 5, -10, 'doh')
>>> cl[^124]'doh'
>>> cl[^4]'doh'
>>> cl.append('fuuu')
>>> cl
[1, 3, 5, -10, 'doh', 'fuuu', ...]
>>> cl.remove(-10)
>>> cl
[1, 3, 5, 'doh', 'fuuu', ...]
>>> i = iter(cl)
>>> i.next()
1
>>> i.next()
3
>>> cl.remove(5)
>>> cl.remove('fuuu')
>>> i.next()
'doh'
>>> i.next()
1

Mümkün olduğunda Python’ın list veri yapısına benzetmeye çalıştım(append, remove, repr falan). Ne işe yarar henüz hiçbir fikrim yok :)