【发布时间】:2012-06-02 22:01:17
【问题描述】:
在我正在编写的 Python 程序中,我使用字典构建了一个链表,该字典将每个节点映射到其后继节点(最后一个节点映射为 None)。
(实际上,字典包含 Wikipedia 告诉我的称为 spaghetti stack 的内容,它是一棵树,其中每个节点都链接到其父节点但不链接其子节点。这意味着叶节点有许多部分重叠的路径到根节点。我只关心其中一个路径,从特定的叶节点开始。这对于这个问题并不重要,除了排除任何涉及迭代字典中所有元素的解决方案。)
我需要将此列表作为可迭代对象传递给另一个函数。我知道我可以使用生成器函数(见下面的代码)来做到这一点,但似乎应该有一个内置函数来使我需要的迭代器在一行中(或者可能是一个生成器表达式)。我已经在文档中进行了一些搜索,但 itertools 或 functools 模块中似乎没有任何内容适用,我不知道还能去哪里看。
这是我现在拥有的生成器函数。外部函数可以被消除(内联),但内部生成器似乎是使数据可迭代的唯一简单方法:
def makeListGenerator(nextDict, start):
def gen(node):
while node:
yield node
node = nextDict[node]
return gen(start)
似乎这种生成器应该有一个模式,但我不确定它会被称为什么。这是一个通用版本:
def makeGenericGenerator(nextFunc, continueFunc, start):
def gen(value):
while continueFunc(value):
yield value
value = nextFunc(value)
return gen(start)
我可以使用这个调用来实现特定版本:
makeGenericGenerator(lambda v: nextDict[v], bool, start)
Python 标准库中是否已经存在类似的东西?
【问题讨论】:
-
我真的不明白为什么这会比生成器更通用。这不是一个真正的常见操作。存在生成器表达式用于从可迭代对象生成生成器,但在您的情况下,这没有用。生成器就差不多了。
-
这是可能的(如果结果可能是一个列表),但不推荐例如stackoverflow.com/a/7742030/4279