我有一个生成器,从有向无环图(DAG)生成节点,深度优先:
def depth_first_search(self):
yield self, 0 # root
for child in self.get_child_nodes():
for node, depth in child.depth_first_search():
yield node, depth+1
Run Code Online (Sandbox Code Playgroud)
我可以像这样遍历节点
for node, depth in graph.depth_first_search():
# do something
Run Code Online (Sandbox Code Playgroud)
如果满足某些条件,我希望能够从for循环告诉生成器停止在图中更深入.
我提出了以下解决方案,它使用外部函数.
def depth_first_search(self, stop_crit=lambda n,d: False):
yield self, 0 # root
for child in self.get_child_nodes():
for node, depth in child.depth_first_search():
yield node, depth+1
if stop_crit(node, depth): break
Run Code Online (Sandbox Code Playgroud)
这个解决方案迫使我在定义stop_crit之前声明我需要的变量,以便可以从中访问它们.
在Ruby中,yield返回块中的最后一个表达式,因此可以方便地用于告诉生成器继续或停止.
在Python中实现此功能的最佳方法是什么?
我正在寻找一种简洁实用的样式方法,将函数应用于元组的一个元素并返回Python中的新元组.
例如,对于以下输入:
inp = ("hello", "my", "friend")
Run Code Online (Sandbox Code Playgroud)
我希望能够得到以下输出:
out = ("hello", "MY", "friend")
Run Code Online (Sandbox Code Playgroud)
我想出了两个我不满意的解决方案.
一个使用高阶函数.
def apply_at(arr, func, i):
return arr[0:i] + [func(arr[i])] + arr[i+1:]
apply_at(inp, lambda x: x.upper(), 1)
Run Code Online (Sandbox Code Playgroud)
一个使用列表推导(这个假定元组的长度是已知的).
[(a,b.upper(),c) for a,b,c in [inp]][0]
Run Code Online (Sandbox Code Playgroud)
有没有更好的办法?谢谢!