ITPub博客

首页 > 数据库 > 数据库开发技术 > Python编程技巧:你经常写for循环吗?那这份快速精简多层嵌套循环的攻略你一定要收好~~

Python编程技巧:你经常写for循环吗?那这份快速精简多层嵌套循环的攻略你一定要收好~~

原创 数据库开发技术 作者:jackzhang 时间:2024-04-28 06:30:00 0 删除 编辑

你曾经会不会写这样的 for 循环代码?

虽然不常见也不太理想,但有时我们确实需要编写多个嵌套的 for 循环来完成某些任务。来看一个简单的3个嵌套循环示例:

    for fruit in ['apple', 'orange', 'pear']:
        for style in ['pie', 'juice']:
            for color in ['red', 'blue']:
                print(fruit, style, color)

使用itertools.product简化for循环

在Python中,itertools.product 是一个强大的工具,用于生成笛卡尔积,即从给定的多个集合中生成所有可能的组合。这个函数是 itertools 模块的一部分,该模块提供了许多高效的迭代器工具,旨在帮助执行常见的迭代和组合任务。

作用

itertools.product 用于从多个迭代器(可以理解为列表、元组、集合等)生成所有可能的元组组合。如果你有多个列表(或其他可迭代对象),并且想要生成这些列表中所有可能的组合,itertools.product 是一个非常适合的工具。

原理

itertools.product 本质上是一个用于生成笛卡尔积的迭代器。"笛卡尔积" 指的是一种数学上的集合运算,给定若干个集合,它会返回一个集合,包含所有可能的有序对组合,每个有序对包含来自每个集合的一个元素。简而言之,itertools.product 遍历所有输入集合,生成它们所有可能的组合。

itertools 是标准的 Python 库的一部分,这意味着使用它我们不需要安装任何第三方库。只需要使用 import 关键字导入即可。使用这个库的 product 方法可以极大精简 for 循环数量。比如,前面的3层嵌套循环示例用一行代码即可实现:

from itertools import product

fruits = ['apple', 'orange', 'pear']
    styles = ['pie', 'juice']
    colors = ['red', 'blue']
    for fruit, style, color in product(fruits, styles, colors):
        print(fruit, style, color)

请注意,使用 itertools.product,我们不再需要处理多个嵌套循环 — 只需将所有可迭代对象放入 itertools.product 即可,它会为我们自动完成所有迭代工作。

可选参数 repeat

itertools.product 还有一个可选的 repeat 参数,允许一个迭代器与自身进行笛卡尔积计算指定次数。例如,如果你想生成从0到1的所有二位二进制数:

from itertools import product

binary_numbers = list(itertools.product([0, 1], repeat=2))
print(binary_numbers)

输出将是:

[(0, 0), (0, 1), (1, 0), (1, 1)]

这显示了生成所有两位二进制数的组合。

其他例子

例如,对最开始的5层嵌套循环,我们同样可以使用 itertools.product 对循环数量进行有效压缩:

from itertools import product

names = ['Jack', 'John']
    countries = ['USA', 'China']
    cities = ['New York', 'San Francisco']
    states = ['CA', 'NV']
    counties = ['Cook', 'Miami']
    for name, country, city, state, county in product(names, countries, cities, states, counties):
        print(name, country, city, state, county, sep='-')

输出:

Jack-USA-New York-CA-Cook
Jack-USA-New York-CA-Miami
Jack-USA-New York-NV-Cook
Jack-USA-New York-NV-Miami
Jack-USA-San Francisco-CA-Cook
Jack-USA-San Francisco-CA-Miami
Jack-USA-San Francisco-NV-Cook
Jack-USA-San Francisco-NV-Miami
Jack-China-New York-CA-Cook
Jack-China-New York-CA-Miami
Jack-China-New York-NV-Cook
Jack-China-New York-NV-Miami
Jack-China-San Francisco-CA-Cook
Jack-China-San Francisco-CA-Miami
Jack-China-San Francisco-NV-Cook
Jack-China-San Francisco-NV-Miami
John-USA-New York-CA-Cook
John-USA-New York-CA-Miami
John-USA-New York-NV-Cook
John-USA-New York-NV-Miami
John-USA-San Francisco-CA-Cook
John-USA-San Francisco-CA-Miami
John-USA-San Francisco-NV-Cook
John-USA-San Francisco-NV-Miami
John-China-New York-CA-Cook
John-China-New York-CA-Miami
John-China-New York-NV-Cook
John-China-New York-NV-Miami
John-China-San Francisco-CA-Cook
John-China-San Francisco-CA-Miami
John-China-San Francisco-NV-Cook
John-China-San Francisco-NV-Miami

在这个例子中我们有5个可迭代对象,然后我们将其传给 itertools.product() 方法,因此,最后就会有5个迭代器变量:name, country, city, state, county 。

性能注意事项

虽然 itertools.product 非常强大和方便,但在处理大量输入集合或很大的集合时,生成的组合数可能会非常庞大。这意味着内存消耗可能会变得相当大,特别是如果你尝试将结果存储在内存中(如将其转换为列表)。因此,在使用 itertools.product 时,最好能以迭代方式处理每个组合,避免一次性加载所有组合到内存中(比如,使用生成器)。

总之,itertools.product 是一个可以有效精简多层嵌套 for 循环的工具,用于生成多个集合的所有可能组合,广泛应用于需要组合数据的场景中。


“

如果你觉得这篇文章对你有用,请“点赞➕关注”支持我!关注我,带你解锁更多Python实用技能、数据分析知识以及更多AI工具和新玩法!

Thank you for reading!

- END -

推荐阅读👇👇👇

Pandas高级功能:提升您的数据处理技能。值得一看!(建议收藏~~)

模拟现实:利用Python的Faker库生成逼真的测试数据,一个超实用的Python库!

一键搞定:使用Python批量合并Excel文件的终极指南

Python如何从SQL Server中存取数据?

再见pandas,你好polars!


原文作者:数据派探险家;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2017-12-19

  • 博文量
    119
  • 访问量
    55947