限制python中组合/排列的数量

时间:2014-05-18 13:33:10

标签: python list permutation itertools

我打算使用itertools生成一些组合,当我意识到随着元素数量的增加,所用的时间会呈指数级增长。我可以限制或指示要生成的最大排列数,以便itertools在达到该限制后停止。

我的意思是:

目前我有

#big_list is a list of lists
permutation_list = list(itertools.product(*big_list))

目前,这种排列列表有超过600万个排列。我很确定如果我添加另一个列表,这个数字将达到十亿美元。

我真正需要的是大量的排列(比方说5000)。有没有办法限制生成的permutation_list的大小?

3 个答案:

答案 0 :(得分:8)

您需要使用itertools.islice,就像这样

itertools.islice(itertools.product(*big_list), 5000)

它不会在内存中创建整个列表,但会返回一个迭代器,它会懒惰地使用实际的迭代。您可以将其转换为此类列表

list(itertools.islice(itertools.product(*big_list), 5000))

答案 1 :(得分:1)

itertools.islice有许多好处,例如设置startstep的能力。下面的解决方案并不灵活,只有在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返回一个迭代器,当最短的iterable耗尽时停止。转换为list的方式与第一个解决方案相同。

答案 2 :(得分:0)

你可以尝试这种方法来获得特定数量的排列结果,排列产生的结果是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:
           break