假设我有一个简单的链表实现,使用称为“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]
我很难想出任何用列表推导式实现这个的方法。难道没有其他方法吗?
假设我有一个简单的链表实现,使用称为“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]
我很难想出任何用列表推导式实现这个的方法。难道没有其他方法吗?
摘要: 列表推导式是基于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采用赋值表达式也将有助于您的使用情况。