迭代工具组合/排列大小

5

有没有一种方法可以查看itertools.Combination或其他对象的len(),而无需将其实现为列表?
我可以通过阶乘获取组合或排列的基数,但我想要一些通用的方法。

谢谢


请注意,您可以计算其中一些可能比仅迭代它们更快-例如,可以通过导入math.perm并使用可迭代对象的长度以及传递给itertools.permutations的(可选参数)组大小来计算itertools.permutations的长度,而无需迭代它。以这个为例:from math import perm; from itertools import permutations as p; letters = "asdfjkl"; group = 3; it = p(letters, group); total = perm(len(letters), group); length = sum(1 for _ in it); length == total; - Shmack
3个回答

13

对于任何可迭代对象 it,您可以执行以下操作:

length = sum(1 for ignore in it)

这不会创建一个列表,所以它的内存占用很小。但对于许多种类型的可迭代对象,它还会消耗 it(例如,如果 it 是生成器,则被消耗后无法重新启动;如果 it 是一个列表,则不会被消耗)。通常没有一种“非破坏性”的方法来确定任意可迭代对象的长度。

还要注意,如果 it 提供了一个无限序列的对象,上述代码将会“永远”运行下去。


2
这会修改迭代器,使得再次尝试迭代它时不会有任何作用。为了缓解这个问题,在使用itertools时,我做了以下操作:import itertools,然后 itCopy = itertools.tee(it),接着 length = sum(1 for ignore in itCopy),最后 for i in list(it): .. - Alex Hall

3

无需创建列表。您可以在不存储整个集合的情况下计算可迭代对象中的项目数:

sum(1 for _ in myIterable)

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,