小编Mat*_*ieu的帖子

在Python中从块内停止生成器

我有一个生成器,从有向无环图(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 generator

4
推荐指数
2
解决办法
1万
查看次数

将函数应用于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)

有没有更好的办法?谢谢!

python list-comprehension

2
推荐指数
2
解决办法
2559
查看次数

标签 统计

python ×2

generator ×1

list-comprehension ×1