R expand.grid() function in Python
python, r
Solution
Here's an example that gives output similar to what you need:
import itertools
def expandgrid(*itrs):
product = list(itertools.product(*itrs))
return {'Var{}'.format(i+1):[x[i] for x in product] for i in range(len(itrs))}
>>> a = [1,2,3]
>>> b = [5,7,9]
>>> expandgrid(a, b)
{'Var1': [1, 1, 1, 2, 2, 2, 3, 3, 3], 'Var2': [5, 7, 9, 5, 7, 9, 5, 7, 9]}
The difference is related to the fact that in `itertools.product` the rightmost element advances on every iteration. You can tweak the function by sorting the `product` list smartly if it's important.
EDIT (by S. Laurent)
To have the same as R:
def expandgrid(*itrs): # https://stackoverflow.com/a/12131385/1100107
"""
Cartesian product. Reversion is for compatibility with R.
"""
product = list(itertools.product(*reversed(itrs)))
return [[x[i] for x in product] for i in range(len(itrs))][::-1]
Problem
Is there a Python function similar to the expand.grid() function in R ? Thanks in advance. (EDIT) Below are the description of this R function and an example. ``` Create a Data Frame from All Combinations of Factors Description: Create a data frame from all combinations of the supplied vectors or factors. > x <- 1:3 > y <- 1:3 > expand.grid(x,y) Var1 Var2 1 1 1 2 2 1 3 3 1 4 1 2 5 2 2 6 3 2 7 1 3 8 2 3 9 3 3 ``` (EDIT2) Below is an example with the rpy package. I would like to get the same output object but without using R : ``` >>> from rpy import * >>> a = [1,2,3] >>> b = [5,7,9] >>> r.assign("a",a) [1, 2, 3] >>> r.assign("b",b) [5, 7, 9] >>> r("expand.grid(a,b)") {'Var1': [1, 2, 3, 1, 2, 3, 1, 2, 3], 'Var2': [5, 5, 5, 7, 7, 7, 9, 9, 9]} ``` EDIT 02/09/2012: I'm really lost with Python. Lev Levitsky's code given in his answer does not work for me: ``` >>> a = [1,2,3] >>> b = [5,7,9] >>> expandgrid(a, b) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 2, in expandgrid NameError: global name 'itertools' is not defined ``` However the itertools module seems to be installed (typing `from itertools import *` does not return any error message)