# [Chicago] Printing out the Cartesian product.

Joshua Herman zitterbewegung at gmail.com
Thu Jul 16 01:45:07 CEST 2015

```What is your definition of the cartesian product because it is defined on
sets not on lists?
A list is most like a bag in set theory. A list is not a set.

http://stackoverflow.com/questions/533905/get-the-cartesian-product-of-a-series-of-lists-in-python

On Wed, Jul 15, 2015 at 5:15 PM, Lewit, Douglas <d-lewit at neiu.edu> wrote:

> Hi everyone,
>
> I need some advice on how to do something.  Let's say that I want to print
> out the Cartesian product of the integers 1 to 4.  It would look something
> like this:
>
> 1, 1, 1, 1
> 1, 1, 1, 2
> 1, 1, 1, 3
> 1, 1, 1, 4
> 1, 1, 2, 1
> 1, 1, 2, 2
> 1, 1, 2, 3
> 1, 1, 2, 4
> 1, 1, 3, 1
> 1, 1, 3, 2
> 1, 1, 3, 3, etc, etc until finally we have
> ..............
> 4, 4, 4, 3
> 4, 4, 4, 4
>
> This is NOT a permutation because repetition is allowed.  Nor is it a
> combination because for example 1, 1, 1, 2 is distinct from 2, 1, 1, 1.  I
> believe this is technically called a Cartesian product.
>
> I know of two ways to do this:
>
> Method #1:
>
> *for a in range(1, 5):*
> *     for b in range(1, 5):*
> *          for c in range(1, 5):*
> *                for d in range(1, 5):*
> *                      print( a, end = ", " )*
> *                      print( b, end = ", " )*
> *                      print( c, end = ", " )*
> *                      print( d, end = "\n" )*
>
>
> The above works just fine!  But there's a problem.  What if let's say I
> want the Cartesian product of all the integers from 1 to 10?  That means
> working with 10 nested for-loops!  That's insane!  It's tedious to write
> and probably even worse for the person who is reading it.  So this method
> is limited to smaller examples.
>
> Method #2:
>
> Cheat by using Python's itertools package!  (Or is it a library?  What's
> the difference between a package and a library?)
>
> import itertools
>
> carProduct = itertools.product([1, 2, 3, 4], repeat = 4)
>
> *try:*
> *     while True:*
> *               print( next(carProduct) )*
> *except StopIteration:*
> *      pass*
>
> This method is short and sweet!  It works great!  But it's really cheating
> in the sense that the programmer is taking advantage of code that has
> already been written.  (I have nothing against doing that!  But in a CS
> class if I write down that answer on an exam do you think the professor is
> going to give me any credit?  Probably not!!!  LOL! )
>
> Is there some other way?  I'm guessing that I would need a for-loop that
> contains a recursive function.  Or.... maybe a recursive function that
> contains a for-loop?  I really don't know.  I've been struggling with this
> for a couple days now and I can't think of a solution.  Can someone please
> enlighten me?
>
> Gratefully,
>
> Douglas.
>
>
> _______________________________________________
> Chicago mailing list
> Chicago at python.org
> https://mail.python.org/mailman/listinfo/chicago
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/chicago/attachments/20150715/682e6049/attachment.html>
```