Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Generating all possible combinations of a list, "itertools.combinations" misses some results

Given a list of items in Python, how can I get all the possible combinations of the items?

There are several similar questions on this site, that suggest using itertools.combinations, but that returns only a subset of what I need:

stuff = [1, 2, 3]
for L in range(0, len(stuff)+1):
    for subset in itertools.combinations(stuff, L):
        print(subset)

()
(1,)
(2,)
(3,)
(1, 2)
(1, 3)
(2, 3)
(1, 2, 3)

As you see, it returns only items in a strict order, not returning (2, 1), (3, 2), (3, 1), (2, 1, 3), (3, 1, 2), (2, 3, 1), and (3, 2, 1). Is there some workaround for that? I can't seem to come up with anything.

like image 526
Minas Abovyan Avatar asked Jul 02 '13 19:07

Minas Abovyan


People also ask

How do you get all possible combinations of a list in Python without Itertools?

Using recursion. To create combinations without using itertools, iterate the list one by one and fix the first element of the list and make combinations with the remaining list. Similarly, iterate with all the list elements one by one by recursion of the remaining list.

How do you generate all possible combinations of two lists in Python?

The unique combination of two lists in Python can be formed by pairing each element of the first list with the elements of the second list. Method 1 : Using permutation() of itertools package and zip() function. Approach : Import itertools package and initialize list_1 and list_2.


3 Answers

Use itertools.permutations:

>>> import itertools >>> stuff = [1, 2, 3] >>> for L in range(0, len(stuff)+1):         for subset in itertools.permutations(stuff, L):                 print(subset) ...          () (1,) (2,) (3,) (1, 2) (1, 3) (2, 1) (2, 3) (3, 1) .... 

Help on itertools.permutations:

permutations(iterable[, r]) --> permutations object  Return successive r-length permutations of elements in the iterable.  permutations(range(3), 2) --> (0,1), (0,2), (1,0), (1,2), (2,0), (2,1) 
like image 101
Ashwini Chaudhary Avatar answered Oct 13 '22 11:10

Ashwini Chaudhary


You can generate all the combinations of a list in python using this simple code

import itertools  a = [1,2,3,4] for i in xrange(1,len(a)+1):    print list(itertools.combinations(a,i)) 

Result:

[(1,), (2,), (3,), (4,)] [(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)] [(1, 2, 3), (1, 2, 4), (1, 3, 4), (2, 3, 4)] [(1, 2, 3, 4)] 
like image 22
saimadhu.polamuri Avatar answered Oct 13 '22 10:10

saimadhu.polamuri


Are you looking for itertools.permutations instead?

From help(itertools.permutations),

Help on class permutations in module itertools:

class permutations(__builtin__.object)
 |  permutations(iterable[, r]) --> permutations object
 |  
 |  Return successive r-length permutations of elements in the iterable.
 |  
 |  permutations(range(3), 2) --> (0,1), (0,2), (1,0), (1,2), (2,0), (2,1)

Sample Code :

>>> from itertools import permutations
>>> stuff = [1, 2, 3]
>>> for i in range(0, len(stuff)+1):
        for subset in permutations(stuff, i):
               print(subset)


()
(1,)
(2,)
(3,)
(1, 2)
(1, 3)
(2, 1)
(2, 3)
(3, 1)
(3, 2)
(1, 2, 3)
(1, 3, 2)
(2, 1, 3)
(2, 3, 1)
(3, 1, 2)
(3, 2, 1)

From Wikipedia, the difference between permutations and combinations :

Permutation :

Informally, a permutation of a set of objects is an arrangement of those objects into a particular order. For example, there are six permutations of the set {1,2,3}, namely (1,2,3), (1,3,2), (2,1,3), (2,3,1), (3,1,2), and (3,2,1).

Combination :

In mathematics a combination is a way of selecting several things out of a larger group, where (unlike permutations) order does not matter.

like image 35
Sukrit Kalra Avatar answered Oct 13 '22 10:10

Sukrit Kalra