У меня есть узел класса:
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.
Любые предложения или идеи будут полезны! Спасибо.
@EPo {1, 2, 3} - это пример того, чем может быть узел. Узел также может быть {3, 5, 6, 8} и так далее. Каждый из элементов в этих примерах является узлами. (Они как бы накладываются друг на друга)
Это список node.val? Я думаю, вы неправильно используете формулировку, node не является чем-то общим в классе python snd, который вы определяете, никогда не отображается как {1, 2, 3}, поскольку нет метода rept или str. также в python {1, 2, 3} - это набор, он не сохраняет порядок элементов.
Также сбивает с толку использование переменной класса slots - какой особый смысл ей придается?
@EPo Да, я думаю, что неправильно употребляю формулировку - извините за это. У меня есть настраиваемая функция для класса, чтобы возвращать связанные узлы (я добавлю ее в ближайшее время). Я также хотел использовать скобку как способ представить узлы, уложенные друг на друга; извините за то, что перепутали с наборами.






Вероятно, вам понадобится ','.join(a, b), но более глубокие проблемы с кодом кроются в другом месте, см. Комментарии.
По сути, вы пытаетесь разработать цепочку, но python не слишком хорош для хранения указателей, в отличие от C. Если вам не нужно использовать класс, считайте свою структуру данных, например, списком словарей.
Хм, я не думаю, что "," .join (str_rep) сработает, потому что, поскольку это рекурсивная функция, она добавит несколько ",". Например, если узел был 1-> 2-> 3-> 4-> None, функция reverse_str вернет: 4, ,,, ,, ,,,, ,,, 3, ,,, 2, 1 как результат. Думаю, мне нужен особый случай, когда я дохожу до конца списка в начале, чтобы правильно отформатировать запятые. Спасибо за вашу помощь!
Проблема не в запятых, проблема в том, чтобы разбудить ваш список, чтобы получить список, с которым вы соединяетесь с помощью join.
Вы можете создать атрибут, который действует как «помощник» для создания списка узлов, а затем использовать метод __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) - это настоящий механизм.
Вам нужно проверить случай, когда узел имеет значение 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
Что подразумевается под узлом {1, 2, 3}?