你曾经会不会写这样的 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 即可,它会为我们自动完成所有迭代工作。
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库!
原文作者:数据派探险家;如有侵权,请联系管理员删除。