我正在使用 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,结合 reduce
和 mul
:
>>> 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/