Сводка: Понимание списка разработано вокруг циклов 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 выражений присваивания также поможет в вашем случае использования.