Limiting the number of combinations /permutations

2019-07-20 04:00发布

问题:

I was going to generate some combination using the itertools, when i realized that as the number of elements increase the time taken will increase exponentially. Can i limit or indicate the maximum number of permutations to be produced so that itertools would stop after that limit is reached.

What i mean to say is:

Currently i have

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

Currently this permutation list has over 6 Million permutations. I am pretty sure if i add another list, this number would hit the billion mark.

What i really need is a significant amount of permutations (lets say 5000). Is there a way to limit the size of the permutation_list that is produced?

回答1:

You need to use itertools.islice, like this

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

It doesn't create the entire list in memory, but it returns an iterator which consumes the actual iterable lazily. You can convert that to a list like this

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


回答2:

itertools.islice has many benefits such as ability to set start and step. Solutions below aren't that flexible and you should use them only if start is 0 and step is 1. On the other hand, they don't require any imports.


You could create a tiny wrapper around itertools.product

it = itertools.product(*big_list)
pg = (next(it) for _ in range(5000)) # generator expression

(next(it) for _ in range(5000)) returns a generator not capable of producing more than 5000 values. Convert it to list by using the list constructor

pl = list(pg)

or by wrapping the generator expression with square brackets (instead of round ones)

pl = [next(it) for _ in range(5000)] # list comprehension

Another solution, which is just as efficient as the first one, is

pg = (p for p, _ in zip(itertools.product(*big_list), range(5000))

Works in Python 3+, where zip returns an iterator that stops when the shortest iterable is exhausted. Conversion to list is done as in the first solution.



回答3:

You can try out this method to get particular number of permutations number of results a permutation produce is n! where n stands for the number of elements in a list for example if you want to get only 2 results then you can try the following:

Use any temporary variable and limit it

    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