Python:如何使用列表推导式将链表转换为列表?

5

假设我有一个简单的链表实现,使用称为“child”的字典将节点与链表中的下一个节点相关联。

例如:

 a->b->c->d

Would be :

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

将其转换为普通列表很简单,
myList=[]
node=a
while node!=None:
    myList.append(node)
    node=child[node]

我很难想出任何用列表推导式实现这个的方法。难道没有其他方法吗?

1个回答

6

摘要: 列表推导式是基于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采用赋值表达式也将有助于您的使用情况。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接