Вернуть строковое представление класса узла в обратном порядке с помощью рекурсии

У меня есть узел класса:

class LinkedNode:
    __slots__ = 'val', 'next'
    def __init__(self, val, next):
        self.val = val  # element at the node
        self.next = next  # next node reference

    def __str__(self):
        return str(self.val)

    __repr__ = __str__

Я пытаюсь вернуть строковое представление списка узлов в обратном порядке, но использую рекурсию. Он не изменяет узел, а только возвращает строковое представление узла. Тоже хочу правильно отформатировать.

Итак, если узел был:

{1, 2, 3}

Я хочу использовать рекурсивную функцию, чтобы она могла печатать:

3, 2, 1

У меня есть такая функция:

def reverse_str(node):
    str_rep = ""
    if node is None:
        return str_rep
    else:
        str_rep = str(node.val)
        # For str(node.val), there is a class function that returns 
        # str(self.val)
        str_rep = reverse_str(node.next) + str_rep + ", "

Если узел был:

{1, 2, 3}

Мой результат:

3, 2, 1, # Trailing comma

Кажется, я не могу найти способ избавиться от конечной запятой, сохранив при этом функцию рекурсивной. Вероятно, это простой оператор if / else, но я не уверен, что тестировать, чтобы увидеть, является ли это первым головным узлом. Я также не хочу изменять класс Node.

Любые предложения или идеи будут полезны! Спасибо.

Что подразумевается под узлом {1, 2, 3}?

Evgeny 18.09.2018 23:58

@EPo {1, 2, 3} - это пример того, чем может быть узел. Узел также может быть {3, 5, 6, 8} и так далее. Каждый из элементов в этих примерах является узлами. (Они как бы накладываются друг на друга)

An Unsullied 19.09.2018 00:01

Это список node.val? Я думаю, вы неправильно используете формулировку, node не является чем-то общим в классе python snd, который вы определяете, никогда не отображается как {1, 2, 3}, поскольку нет метода rept или str. также в python {1, 2, 3} - это набор, он не сохраняет порядок элементов.

Evgeny 19.09.2018 00:07

Также сбивает с толку использование переменной класса slots - какой особый смысл ей придается?

Evgeny 19.09.2018 00:11

@EPo Да, я думаю, что неправильно употребляю формулировку - извините за это. У меня есть настраиваемая функция для класса, чтобы возвращать связанные узлы (я добавлю ее в ближайшее время). Я также хотел использовать скобку как способ представить узлы, уложенные друг на друга; извините за то, что перепутали с наборами.

An Unsullied 19.09.2018 00:12
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
5
370
3

Ответы 3

Вероятно, вам понадобится ','.join(a, b), но более глубокие проблемы с кодом кроются в другом месте, см. Комментарии.

По сути, вы пытаетесь разработать цепочку, но python не слишком хорош для хранения указателей, в отличие от C. Если вам не нужно использовать класс, считайте свою структуру данных, например, списком словарей.

Хм, я не думаю, что "," .join (str_rep) сработает, потому что, поскольку это рекурсивная функция, она добавит несколько ",". Например, если узел был 1-> 2-> 3-> 4-> None, функция reverse_str вернет: 4, ,,, ,, ,,,, ,,, 3, ,,, 2, 1 как результат. Думаю, мне нужен особый случай, когда я дохожу до конца списка в начале, чтобы правильно отформатировать запятые. Спасибо за вашу помощь!

An Unsullied 19.09.2018 00:44

Проблема не в запятых, проблема в том, чтобы разбудить ваш список, чтобы получить список, с которым вы соединяетесь с помощью join.

Evgeny 19.09.2018 01:01

Вы можете создать атрибут, который действует как «помощник» для создания списка узлов, а затем использовать метод __str__ для возврата строки:

class _List:
  def __init__(self, _val=None):
    self.val, self._next = _val, None
  def insert_val(self, _val):
    if self.val is None:
      self.val = _val
    else:
      getattr(self._next, 'insert_val', lambda x:setattr(self, '_next', _List(x)))(_val)
  @property
  def to_list(self):
    return [self.val, *getattr(self._next, 'to_list', [])]
  def __str__(self):
    return ', '.join(list(map(str, self.to_list))[::-1])

l = _List()
for i in range(10):
  l.insert_val(i)

print(l)

Выход:

9, 8, 7, 6, 5, 4, 3, 2, 1, 0
getattr(self._next, 'insert_val', lambda x:setattr(self, '_next', _List(x)))(_val) - это настоящий механизм.
Evgeny 19.09.2018 01:03

Вам нужно проверить случай, когда узел имеет значение None (т.е. предыдущий узел был последним) и обработать этот случай по-другому, например:

def reverse_str(node):
    if node is None:
        return None
    else:
        str_rep = str(node.val)
        # For str(node.val), there is a class function that returns
        # str(self.val)
        s = reverse_str(node.next)
        str_rep = s + ", " + str_rep if s else str_rep
        return str_rep

three = LinkedNode(3, None)
two = LinkedNode(2, three)
one = LinkedNode(1, two)

print(reverse_str(one))

Выход

3, 2, 1

Другие вопросы по теме