Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > Combining arbitrary lists

Reply
Thread Tools

Combining arbitrary lists

 
 
Nick
Guest
Posts: n/a
 
      11-15-2004
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.
 
Reply With Quote
 
 
 
 
Mariano Draghi
Guest
Posts: n/a
 
      11-15-2004
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


De nada

--
Mariano

 
Reply With Quote
 
 
 
 
Nick
Guest
Posts: n/a
 
      11-15-2004
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

>
>
> De nada
>

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

Nick.
 
Reply With Quote
 
Mariano Draghi
Guest
Posts: n/a
 
      11-15-2004
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 "combination" there... I think (don't remember exactly).

You can also do a search in the comp.lang.python group using Google.
Try this:
http://groups.google.com/groups?q=co....lang.python.*

Regards,

--
Mariano

 
Reply With Quote
 
Bengt Richter
Guest
Posts: n/a
 
      11-15-2004
On Mon, 15 Nov 2004 00:57:03 -0300, Mariano Draghi <(E-Mail Removed)> 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
 
Reply With Quote
 
Thorsten Kampe
Guest
Posts: n/a
 
      11-15-2004
* 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')

 
Reply With Quote
 
Steve Holden
Guest
Posts: n/a
 
      11-15-2004
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(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
--
http://www.holdenweb.com
http://pydish.holdenweb.com
Holden Web LLC +1 800 494 3119
 
Reply With Quote
 
N Chackowsky
Guest
Posts: n/a
 
      11-15-2004
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.
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
List of lists of lists of lists... =?UTF-8?B?w4FuZ2VsIEd1dGnDqXJyZXogUm9kcsOtZ3Vleg==?= Python 5 05-15-2006 11:47 AM
Refactoring; arbitrary expression in lists Frans Englich Python 15 01-14-2005 09:55 PM
lists of lists Jon Slaughter C++ 4 12-13-2004 06:28 PM
calling an arbitrary function w/ arbitrary arguments Honestmath C++ 5 12-13-2004 06:18 AM
Sorting lists of lists... JustSomeGuy C++ 0 06-17-2004 05:44 PM



Advertisments