我打算使用迭代工具生成一些组合,这时我意识到,随着元素数量的增加,所花费的时间将成倍增加。我是否可以限制或指示要产生的最大排列数,以便迭代工具在达到该限制后停止。
我想说的是:
目前我有
#big_list is a list of lists
permutation_list = list(itertools.product(*big_list))目前,这个排列列表有600多万个排列。我敢肯定,如果我再加上一个名单,这个数字将达到十亿。
我真正需要的是大量的排列(比如说5000)。是否有办法限制产生的permutation_list的大小?
发布于 2014-05-18 13:37:03
您需要使用itertools.islice,就像这样
itertools.islice(itertools.product(*big_list), 5000)它不会在内存中创建整个列表,但它返回一个迭代器,它以惰性方式消耗实际的可迭代性。你可以把它转换成这样的列表
list(itertools.islice(itertools.product(*big_list), 5000))发布于 2014-05-18 13:37:36
itertools.islice有许多优点,比如能够设置start和step。下面的解决方案并不那么灵活,只有当start为0而step为1时,您才应该使用它们。另一方面,它们不需要任何导入。
您可以在itertools.product周围创建一个小包装器。
it = itertools.product(*big_list)
pg = (next(it) for _ in range(5000)) # generator expression(next(it) for _ in range(5000))返回一个不能产生5000多个值的生成器。使用list构造函数将其转换为list
pl = list(pg)或者用方括号(而不是圆形括号)包装生成器表达式。
pl = [next(it) for _ in range(5000)] # list comprehension另一个和第一个一样有效的解决方案是
pg = (p for p, _ in zip(itertools.product(*big_list), range(5000))在Python 3+中工作,其中zip返回一个迭代器,该迭代器在最短的可迭代性耗尽时停止。向list的转换与第一个解决方案一样。
发布于 2018-04-27 07:40:46
您可以尝试这种方法来获得特定数量的排列结果,一个置换产生的结果数是n!其中n表示列表中的元素数,例如,如果您只想获得2个结果,则可以尝试以下操作:
使用任何临时变量并限制它
from itertools import permutations
m=['a','b','c','d']
per=permutations(m)
temp=1
for i in list(per):
if temp<=2: #2 is the limit set
print (i)
temp=temp+1
else:
breakhttps://stackoverflow.com/questions/23722473
复制相似问题