Python:使用列表理解将链接列表转换为列表吗?

Con*_*nry 4 python list-comprehension linked-list list

假设我有一个简单的linked list实现,使用一个名为child的字典,该字典将一个节点与链表中的以下节点相关联。

例如:

 a->b->c->d
Run Code Online (Sandbox Code Playgroud)

将会 :

 {a:b,b:c,c:d,d:None}
Run Code Online (Sandbox Code Playgroud)

将其转换为普通列表很简单,

myList=[]
node=a
while node!=None:
    myList.append(node)
    node=child[node]
Run Code Online (Sandbox Code Playgroud)

我正在努力提出清单理解可能的任何方式。没办法吗

Ray*_*ger 5

简介:列表理解是围绕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']
Run Code Online (Sandbox Code Playgroud)

备选方案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']
Run Code Online (Sandbox Code Playgroud)

评估:这两种选择都有些粗略,因此您在没有列表理解的情况下会更好。简单,直接的代码是最好的:-)

脚注:这个问题很好。有不止一个人建议该语言增加while循环理解。如果该建议得以实现,那么Python 3.8的赋值表达式的采用也将为您的用例提供帮助。