python - 如何获取 itertools.product 的长度?

标签 python python-itertools

我正在使用 itertools 运行数值模拟,迭代输入参数的所有可能组合。在下面的示例中,我有两个参数和六种可能的组合:

import itertools

x = [0, 1]
y = [100, 200, 300]

myprod = itertools.product(x, y)

for p in myprod:
    print p[0], p[1]
    # run myfunction using p[0] as the value of x and p[1] as the value of y

如何获取 myprod 的大小(示例中为 6)?我需要在 for 循环开始之前打印它。

我明白 myprod 不是列表。我可以计算 len(list(myprod)),但这会消耗迭代器,因此 for 循环不再有效。

我试过:

myprod2=copy.deepcopy(myprod)
mylength = len(list(myprod2))

但这也行不通。我可以这样做:

myprod2=itertools.product(x,y)
mylength = len(list(myprod2))

但它算不上优雅和 python 式!

最佳答案

为任意数量的源可迭代对象实现 Kevin's answer,结合 reducemul:

>>> import functools, itertools, operator
>>> iters = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> functools.reduce(operator.mul, map(len, iters), 1)
27
>>> len(list(itertools.product(*iters)))
27

请注意,如果您的源可迭代对象本身是迭代器而不是序列,这将不起作用,原因与您最初尝试获取 itertools.product 的长度失败的原因相同。 Python 通常和 itertools 可以以内存高效的方式处理任何长度(包括无限!)的迭代器,因此预先找出长度并不是它设计用来处理的情况。

关于python - 如何获取 itertools.product 的长度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32074543/

相关文章:

python - 如何迭代不同列表的乘积?

python - 通过每个选择 2 个元素来合并两个列表

Python - 所有组合包括括号

php - SSO 后绑定(bind)到 LDAP?

python - 如果它们都在单引号中,如何拆分值并转换为列表中的 float ?

python - 使用 sudo 运行 Django 找不到已安装的 Homebrew 程序包

python - Exchangelib Python 将电子邮件提取为 HTML,但我想要纯文本

python - 如何调用产生的函数(python 2.7)

python - 使用 itertools 创建 numpy 数组

Python,两个列表之间元素相加的所有组合,有约束