Python: Преобразование связанного списка в список с использованием понимания списка? - PullRequest
0 голосов
/ 20 февраля 2019

Допустим, у меня есть простая реализация linked list, использующая словарь под названием child, который связывает узел со следующим узлом в связанном списке.

Например:

 a->b->c->d

Будет:

 {a:b,b:c,c:d,d:None}

Преобразование этого в обычный список тривиально,

myList=[]
node=a
while node!=None:
    myList.append(node)
    node=child[node]

I 'Я изо всех сил пытаюсь придумать любой способ, которым это было бы возможно с пониманием списка.Нет ли пути?

1 Ответ

0 голосов
/ 20 февраля 2019

Сводка: Понимание списка разработано вокруг циклов for, а не циклов while, так что это не совсем подходит.

Что потребуется: Для цикла for требуется итератор .

Альтернатива 1: Это может работать с пониманием списка, но это повлечет за собой перенос работы в генератор (что, вероятно, не то, на что вы надеялись):

>>> child = {'a':'b', 'b': 'c', 'c': 'd', 'd': None}
>>> def ll_iterator(node):
        while node != None:
            yield node
            node = child[node]

>>> [x for x in ll_iterator('a')]
['a', 'b', 'c', 'd']

Альтернатива 2: Помимо генераторов, другой способ создания итератора - использоватьформа с двумя аргументами iter () .Для этого вам понадобится функция с состоянием и нулевым аргументом, которая генерирует последовательные узлы связанного списка:

>>> child = {'a':'b', 'b': 'c', 'c': 'd', 'd': None}
>>> def next_ll(state=['a']):
        value = state[0]
        if value is not None:
            state[0] = child[value]
            return value

>>> [x for x in iter(next_ll, None)]
['a', 'b', 'c', 'd']

Оценка: Обе эти альтернативы немного грубые, так что вылучше без понимания списка .Простой, прямой код - лучший: -)

Сноска: Этот вопрос хороший.Несколько человек предложили добавить в язык понимание цикла while.Если это предложение когда-нибудь будет реализовано, принятие Python 3.8 выражений присваивания также поможет в вашем случае использования.

...