Назад к вопросам
Middle+
79
questionbank

Как бы вы построили структуру данных, если бы в Python не существовал тип данных list?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Можно эмулировать список с помощью словаря, где ключами будут числовые индексы, а значениями — элементы списка.

# Пример эмуляции списка
data = {}  # Используем словарь
size = 0

def append(item):
    global size
    data[size] = item
    size += 1

def get(index):
    if 0 <= index < size:
        return data[index]
    else:
        raise IndexError("Index out of range")

def set_item(index, item):
    if 0 <= index < size:
        data[index] = item
    else:
        raise IndexError("Index out of range")

def pop():
    global size
    if size > 0:
        size -= 1
        item = data[size]
        del data[size]
        return item
    else:
        raise IndexError("Pop from empty list")

# Использование
append(10)
append(20)
append(30)

print(get(1))  # Вывод: 20

set_item(0, 5)
print(get(0))  # Вывод: 5

print(pop())   # Вывод: 30
print(size)    # Вывод: 2

Преимущества:

  • Позволяет хранить элементы в упорядоченном виде с доступом по индексу.
  • Поддерживает динамическое изменение размера.

Недостатки:

  • Требует ручного управления размером и индексами.
  • Операции вставки или удаления в начале или середине "списка" будут менее эффективны, чем в случае с нативным типом list, так как может потребоваться сдвиг элементов (хотя в данном примере pop реализован для конца).

Альтернативный, более сложный подход, — использовать связанные списки (односвязные или двусвязные), реализованные с помощью классов.

class Node:
    def __init__(self, data=None):
        self.data = data
        self.next = None # Узел односвязного списка

class LinkedList:
    def __init__(self):
        self.head = None

    def append(self, data):
        new_node = Node(data)
        if not self.head:
            self.head = new_node
            return
        last_node = self.head
        while last_node.next:
            last_node = last_node.next
        last_node.next = new_node

    def display(self):
        elements = []
        current = self.head
        while current:
            elements.append(current.data)
            current = current.next
        print(elements)

    # Реализация других операций (get, delete, etc.) потребует дополнительного кода

# Использование
my_list = LinkedList()
my_list.append(1)
my_list.append(2)
my_list.append(3)
my_list.display() # Вывод: [1, 2, 3]

Преимущества:

  • Эффективные операции вставки и удаления в начале или середине списка (при наличии ссылок).

Недостатки:

  • Более сложная реализация.
  • Доступ по индексу требует прохода по списку от начала, что менее эффективно, чем прямой доступ в случае словаря или нативного list.