Combining arbitrary lists

N

Nick

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.
 
N

Nick

B

Bengt Richter

Nick said:
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/Cookbook/Python/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)
[[1, 2, 3], [4, 5, 6], [7, 8]]
... if not LOL: yield []; return
... for h in LOL[0]:
... for t in doit(LOL[1:]):
... yield [h] + t
... ...
[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
 
T

Thorsten Kampe

* 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')
 
S

Steve Holden

Thorsten said:
* 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')

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

regards
Steve
 
N

N Chackowsky

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.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,578
Members
45,052
Latest member
LucyCarper

Latest Threads

Top