2015-01-16 2 views
0

У меня есть структура данных, как:Возможно ли итератору ListNode с функцией map() или reduce()?

class ListNode: 
    def __init__(self, x): 
     self.val = x 
     self.next = None 

Я хочу, чтобы итератор в ListNode один за другой, пока следующий не None

я могу использовать while, но можно использовать карту() или уменьшить() или что-то еще, чтобы сделать код более красивым?

+0

Что? Ваш класс просто статически устанавливает свой «следующий» в «Нет». Поэтому повторение «до следующего -« Нет »ничего не сделает; это уже нет. – BrenBarn

+0

Как 'map()' и 'reduce()' более красивы, чем цикл while? Во всяком случае, вы можете посмотреть в выражения генератора, в зависимости от того, что вы на самом деле пытаетесь сделать. –

ответ

0

Я не думаю, что reduce - это правильный инструмент для работы. Прежде всего, ваш ListNode на самом деле не итерацию, но вы можете исправить это за счет реализации __iter__ функции:

class ListNode: 
    def __init__(self, x, succ=None): 
     self.val = x 
     self.succ = succ 

    def __iter__(self): 
     cur = self 
     while cur is not None: 
      yield cur 
      cur = cur.succ 

Здесь __iter__ функция генератора, yield ИНГ следующего преемника до конца списка не будет достигнуто , Теперь вы можете просто использовать обычный цикл for, чтобы переименовать связанный список:

lst = ListNode(1, ListNode(2, ListNode(3, ListNode(4, ListNode(5))))) 
for ln in lst: 
    print ln.val