Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

All combinations of a list of lists

I'm basically looking for a python version of Combination of List<List<int>>

Given a list of lists, I need a new list that gives all the possible combinations of items between the lists.

[[1,2,3],[4,5,6],[7,8,9,10]] -> [[1,4,7],[1,4,8],...,[3,6,10]] 

The number of lists is unknown, so I need something that works for all cases. Bonus points for elegance!

like image 423
Lin Avatar asked Apr 28 '09 16:04

Lin


People also ask

How do you generate all possible combinations of multiple lists?

Add a Custom Column to and name it List1. Enter the formula =List1. Expand out the new List1 column and then Close & Load the query to a table. The table will have all the combinations of items from both lists and we saved on making a custom column in List1 and avoided using a merge query altogether!

How do you get multiple list combinations in Python?

To get the number of combinations, we can simply use the len function on the combination list which is the output.


2 Answers

you need itertools.product:

>>> import itertools >>> a = [[1,2,3],[4,5,6],[7,8,9,10]] >>> list(itertools.product(*a)) [(1, 4, 7), (1, 4, 8), (1, 4, 9), (1, 4, 10), (1, 5, 7), (1, 5, 8), (1, 5, 9), (1, 5, 10), (1, 6, 7), (1, 6, 8), (1, 6, 9), (1, 6, 10), (2, 4, 7), (2, 4, 8), (2, 4, 9), (2, 4, 10), (2, 5, 7), (2, 5, 8), (2, 5, 9), (2, 5, 10), (2, 6, 7), (2, 6, 8), (2, 6, 9), (2, 6, 10), (3, 4, 7), (3, 4, 8), (3, 4, 9), (3, 4, 10), (3, 5, 7), (3, 5, 8), (3, 5, 9), (3, 5, 10), (3, 6, 7), (3, 6, 8), (3, 6, 9), (3, 6, 10)] 
like image 167
SilentGhost Avatar answered Oct 17 '22 16:10

SilentGhost


The most elegant solution is to use itertools.product in python 2.6.

If you aren't using Python 2.6, the docs for itertools.product actually show an equivalent function to do the product the "manual" way:

def product(*args, **kwds):     # product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dy     # product(range(2), repeat=3) --> 000 001 010 011 100 101 110 111     pools = map(tuple, args) * kwds.get('repeat', 1)     result = [[]]     for pool in pools:         result = [x+[y] for x in result for y in pool]     for prod in result:         yield tuple(prod) 
like image 25
Jarret Hardie Avatar answered Oct 17 '22 16:10

Jarret Hardie