[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文档

相关推荐

  1. Python循环语句——for循环嵌套使用

    2024-07-22 08:54:03       48 阅读
  2. LinkedList元素使用Lanbda表达式循环打印

    2024-07-22 08:54:03       41 阅读
  3. Python-07-循环遍历、嵌套循环

    2024-07-22 08:54:03       25 阅读
  4. Python循环语句——while循环嵌套应用

    2024-07-22 08:54:03       34 阅读
  5. C++循环嵌套和break语句

    2024-07-22 08:54:03       53 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-22 08:54:03       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-22 08:54:03       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-22 08:54:03       45 阅读
  4. Python语言-面向对象

    2024-07-22 08:54:03       55 阅读

热门阅读

  1. 配置php-fpm服务

    2024-07-22 08:54:03       18 阅读
  2. 【机器学习框架TensorFlow和PyTorch】基本使用指南

    2024-07-22 08:54:03       15 阅读
  3. 华为eNSP模拟器安装

    2024-07-22 08:54:03       15 阅读
  4. HTTP协议的演进:从HTTP/1.0到HTTP/2.0

    2024-07-22 08:54:03       13 阅读
  5. 在Ubuntu 14.04上安装和使用Docker Compose的方法

    2024-07-22 08:54:03       16 阅读
  6. 【自动化机器学习AutoML】AutoML工具和平台的使用

    2024-07-22 08:54:03       16 阅读
  7. 【数据挖掘基础】数据挖掘技术概述和基本算法

    2024-07-22 08:54:03       16 阅读
  8. 常用传感器误差补偿方法介绍

    2024-07-22 08:54:03       16 阅读
  9. ARM/Linux嵌入式面经(十七):美团校招面经

    2024-07-22 08:54:03       15 阅读
  10. 深度学习简介(框架)

    2024-07-22 08:54:03       15 阅读
  11. ChatGPT的工作记忆容量:一项实证研究

    2024-07-22 08:54:03       14 阅读
  12. AI学习指南机器学习篇-SOM的拓扑结构与参数调优

    2024-07-22 08:54:03       16 阅读
  13. 如何调整图像的窗宽窗位

    2024-07-22 08:54:03       15 阅读
  14. linux字符设备驱动+fops应用测试程序

    2024-07-22 08:54:03       15 阅读
  15. opencv—常用函数学习_“干货“_14

    2024-07-22 08:54:03       16 阅读
  16. 网络安全防线:黑龙江等级保护测评标准详解

    2024-07-22 08:54:03       16 阅读
  17. thinkphp8结合layui2.9 图片上传验证

    2024-07-22 08:54:03       14 阅读