473,555 Members | 2,333 Online

# Combining arbitrary lists

Given that

n = [ [1, 2, 3], [4, 5, 6], [7, 8] ]

then the following code produces what I expect

for x in n[0]:
for y in n[1]:
for z in n[2]:
print [x, y, z]

--output--
[1, 4, 7]
[1, 4, 8]
[1, 5, 7]
[1, 5, 8]
...
[3, 6, 8]
-- --

How can I do this for an arbirary length of n? This reminds me of those
horrible fraction questions in 1st year comp. sci.
x = 1 + 1/(1 + 1/(1 + 1/(..... )))))... which leads me to suspect that
the simplest solution is recursive... hmmm... I'll take any suggestions.

Muchos Gracias
Nick.
Jul 18 '05 #1
7 1389
Nick wrote:
Given that

n = [ [1, 2, 3], [4, 5, 6], [7, 8] ]

then the following code produces what I expect

for x in n[0]:
for y in n[1]:
for z in n[2]:
print [x, y, z]
....
How can I do this for an arbirary length of n?
I think this is what you're looking for:
http://aspn.activestate.com/ASPN/Coo.../Recipe/302478
Muchos Gracias

--
Mariano

Jul 18 '05 #2
Mariano Draghi wrote:
Nick wrote:
Given that

n = [ [1, 2, 3], [4, 5, 6], [7, 8] ]

then the following code produces what I expect

for x in n[0]:
for y in n[1]:
for z in n[2]:
print [x, y, z]

...

How can I do this for an arbirary length of n?

I think this is what you're looking for:
http://aspn.activestate.com/ASPN/Coo.../Recipe/302478
Muchos Gracias

Okay... a) THANK-YOU, and b) HOW did you find that?

Nick.
Jul 18 '05 #3
Nick wrote:
....
I think this is what you're looking for:
http://aspn.activestate.com/ASPN/Coo.../Recipe/302478
.... Okay... a) THANK-YOU, and b) HOW did you find that?

The ASPN Python Cookbook has plenty of these kind of things.
I looked for "combinatio n" there... I think (don't remember exactly).

You can also do a search in the comp.lang.pytho n group using Google.
Try this:

Regards,

--
Mariano

Jul 18 '05 #4
On Mon, 15 Nov 2004 00:57:03 -0300, Mariano Draghi <md*****@prosud .com> wrote:
Nick wrote:
Given that

n = [ [1, 2, 3], [4, 5, 6], [7, 8] ]

then the following code produces what I expect

for x in n[0]:
for y in n[1]:
for z in n[2]:
print [x, y, z]

...

How can I do this for an arbirary length of n?

I think this is what you're looking for:
http://aspn.activestate.com/ASPN/Coo.../Recipe/302478

Following is a slightly more compact generator (unless I goofed ;-)
(untested beyoud what you see here; probably traded a little speed for code lines)
n [[1, 2, 3], [4, 5, 6], [7, 8]]
def doit(LOL): ... if not LOL: yield []; return
... for h in LOL[0]:
... for t in doit(LOL[1:]):
... yield [h] + t
... for row in doit(n): print row ...
[1, 4, 7]
[1, 4, 8]
[1, 5, 7]
[1, 5, 8]
[1, 6, 7]
[1, 6, 8]
[2, 4, 7]
[2, 4, 8]
[2, 5, 7]
[2, 5, 8]
[2, 6, 7]
[2, 6, 8]
[3, 4, 7]
[3, 4, 8]
[3, 5, 7]
[3, 5, 8]
[3, 6, 7]
[3, 6, 8]
for row in doit([[1,2],[3,4,5]]): print row

...
[1, 3]
[1, 4]
[1, 5]
[2, 3]
[2, 4]
[2, 5]
Regards,
Bengt Richter
Jul 18 '05 #5
* Nick (2004-11-15 04:28 +0100)
Given that

n = [ [1, 2, 3], [4, 5, 6], [7, 8] ]

then the following code produces what I expect

for x in n[0]:
for y in n[1]:
for z in n[2]:
print [x, y, z]

--output--
[1, 4, 7]
[1, 4, 8]
[1, 5, 7]
[1, 5, 8]
...
[3, 6, 8]
-- --

How can I do this for an arbirary length of n?

This is the Cartesian product of three sets. Have a look at
http://www.thorstenkampe.de/python/utils.py:

def cartes(seq0, seq1, modus = 'pair'):
""" return the Cartesian Product of two sequences """
if modus == 'pair':
return [[item0, item1] for item0 in seq0 for item1 in seq1]
elif modus == 'triple':
return [item0 + [item1] for item0 in seq0 for item1 in seq1]

Then you would generate your output like this:
cartes(cartes([1, 2, 3], [4, 5, 6]), [7, 8], 'triple')

Jul 18 '05 #6
Thorsten Kampe wrote:
* Nick (2004-11-15 04:28 +0100)
Given that

n = [ [1, 2, 3], [4, 5, 6], [7, 8] ]

then the following code produces what I expect

for x in n[0]:
for y in n[1]:
for z in n[2]:
print [x, y, z]

--output--
[1, 4, 7]
[1, 4, 8]
[1, 5, 7]
[1, 5, 8]
...
[3, 6, 8]
-- --

How can I do this for an arbirary length of n?

This is the Cartesian product of three sets. Have a look at
http://www.thorstenkampe.de/python/utils.py:

def cartes(seq0, seq1, modus = 'pair'):
""" return the Cartesian Product of two sequences """
if modus == 'pair':
return [[item0, item1] for item0 in seq0 for item1 in seq1]
elif modus == 'triple':
return [item0 + [item1] for item0 in seq0 for item1 in seq1]

Then you would generate your output like this:
cartes(cart es([1, 2, 3], [4, 5, 6]), [7, 8], 'triple')

I think the point of the question was to act on an arbitrary number of
length-3 lists.

regards
Steve
--
http://www.holdenweb.com
http://pydish.holdenweb.com
Holden Web LLC +1 800 494 3119
Jul 18 '05 #7
Thanks to all who replied; very helpful. Bengt Richter: that's a
lovely generator--I'm new to the whole idea of generators, but that's
very clear. I will experiment and test it.

Nick.
Jul 18 '05 #8

This thread has been closed and replies have been disabled. Please start a new discussion.