[trick]使用生成器打破嵌套循环

原文

chain

break用于结束循环。但是,如果有嵌套循环,如何跳出外层循环

def this_is_the_one(x):
    return x == 3

my_list = [[1, 2], [3, 4], [5, 6]]
for sublist in my_list:
    for element in sublist:
        print(f"Checking {element}")
        if this_is_the_one(element):
            # ...?

break 不会有太大帮助,因为它只会跳出内部 for 循环:

for sublist in my_list:
    for element in sublist:
        print(f"Checking {element}")
        if this_is_the_one(element):
            break

"""Output:
Checking 1
Checking 2
Checking 3  # 只跳过了 4
Checking 5
Checking 6
"""

有多种方法可以解决这个困难,在本短文中,我想向您展示如何使用生成器来解决这个问题。核心思想是将嵌套循环提取到一个单独的生成器中,然后在原始循环的位置使用该生成器
将嵌套循环变为一个生成器:

def elements_from_sublists(my_list):
    for sublist in my_list:
        for element in sublist:
            yield element

使用生成器:

for element in elements_from_sublists(my_list):
    print(f"Checking {element}")
    if this_is_the_one(element):
        break

"""Output:
Checking 1
Checking 2
Checking 3
"""

现在我们只有一个循环,所以关键字 break 运行得很完美。将循环逻辑提取到生成器中的这种策略可能非常有用,所以要留意使用它的机会!

奖励:
已经有标准库函数实现了上述的elements_from_sublists功能:

from itertools import chain

for element in chain.from_iterable(my_list):
    print(f"Checking {element}")
    if this_is_the_one(element):
        break

chain.from_iterable([‘ABC’, ‘DEF’]) → A B C D E F
chain文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只大鸽子

如有帮助,欢迎关注同名公众号

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值