1

Тема: Створення класу для збереження даних без базових коллекцій

Доброго дня перепрошую за мою українську. Допоможіть будь ласка не розумію як створити зв'язаний список без базових(dict tuple list etc) колекцій. Задля зберігання самих елементів створив під клас а де зберігати єкземпляри під класу не можу придумати.

class LinkedList:

    class Element:
        def __init__(self, index, value):
            self.__index = index
            self.__value = value

2

Re: Створення класу для збереження даних без базових коллекцій

Я теж вчу Python. Написав такий велосипед:

class Node:
    def __init__(self, value, next = None, prev = None):
        self.value = value
        self.next = next
        self.prev = prev
    def __str__(self):
        return 'Node({0})'.format(self.value)
class Iter:
    def __init__(self, node):
        self.node = node
    def __next__(self):
        if self.node == None:
            raise StopIteration()
        v = self.node.value
        self.node = self.node.next
        return v
    def __str__(self):
        return 'Iter({0})'.format(self.node)
class LinkedList:
    def __init__(self):
        self.first = None
        self.last = None
        self.size = 0
    def __iter__(self):
        return Iter(self.first)
    def __str__(self):
        return 'LinkedList(size:{0})'.format(self.size)
    def add_first(self, value):
        node = self.first
        self.first = Node(value, node, None)
        if self.last == None:
            self.last = self.first
        if node != None:
            node.prev = self.first
        self.size = self.size + 1
    def add_last(self, value):
        node = self.last
        self.last = Node(value, None, node)
        if self.first == None:
            self.first = self.last
        if node != None:
            node.next = self.last
        self.size = self.size + 1
    def pop_first(self):
        if self.first == None:
            raise Exception('List is empty.')
        self.size = self.size - 1
        node = self.first
        self.first = node.next
        if self.first == None:
            self.last = None
        else:
            self.first.prev = None
        node.next = None
    def pop_last(self):
        if self.last == None:
            raise Exception('List is empty.')
        self.size = self.size - 1
        node = self.last
        self.last = node.prev
        if self.last == None:
            self.first = None
        else:
            self.last.next = None
        node.prev = None

ll = LinkedList()
for i in range(5):
    ll.add_last(i)
print(ll)
for i in ll:
    print(i, end=' ')
print()
while ll.size > 0:
    ll.pop_first()
    # ll.pop_last()
print(ll)

Але поки не знаю як повидаляти повторюваний код без втрати функціоналу. Якщо тут є косяки або пропозиції, то пишіть, буду виправляти.

3

Re: Створення класу для збереження даних без базових коллекцій

leofun01 написав:

Якщо тут є косяки або пропозиції, то пишіть

Тут я звертаюсь до всіх форумців, не тільки до автора теми.

Я хочу видалити повторюваний код. А саме:
1. Блок з функціями додаваня елемента

class LinkedList:
    # ...
    def add_first(self, value):
        node = self.first
        self.first = Node(value, node, None)
        if self.last == None:
            self.last = self.first
        if node != None:
            node.prev = self.first
        self.size = self.size + 1
    def add_last(self, value):
        node = self.last
        self.last = Node(value, None, node)
        if self.first == None:
            self.first = self.last
        if node != None:
            node.next = self.last
        self.size = self.size + 1

замінити на

class LinkedList:
    # ...
    def add(self, value, first[, ...]):
        # ... щось спільне
        self.size = self.size + 1
    def add_first(self, value):
        self.add(value, True[, ...])
    def add_last(self, value):
        self.add(value, False[, ...])

2. Блок з функціями видаленя елемента

class LinkedList:
    # ...
    def pop_first(self):
        if self.first == None:
            raise Exception('List is empty.')
        self.size = self.size - 1
        node = self.first
        self.first = node.next
        if self.first == None:
            self.last = None
        else:
            self.first.prev = None
        node.next = None
    def pop_last(self):
        if self.last == None:
            raise Exception('List is empty.')
        self.size = self.size - 1
        node = self.last
        self.last = node.prev
        if self.last == None:
            self.first = None
        else:
            self.last.next = None
        node.prev = None

замінити на

class LinkedList:
    # ...
    def pop(self, first[, ...]):
        self.size = self.size - 1
        # ... щось спільне
    def pop_first(self):
        self.pop(True[, ...])
    def pop_last(self):
        self.pop(False[, ...])

При цьому використаня True|False в параметрах не обовязкове. Задовольняє будь-який спосіб передати інформацію про те, з яким кінцем працювати. Якщо для цього треба змінити структуру списку (LinkedList) або додати якісь функції за межами класу, то це ок.