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)
我正在努力提出清单理解可能的任何方式。没办法吗
简介:列表理解是围绕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的赋值表达式的采用也将为您的用例提供帮助。