By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
439,932 Members | 1,944 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 439,932 IT Pros & Developers. It's quick & easy.

n-dim permutation matrix/generator?

P: n/a
for the purpose of flat n-dim iteration a function or generator ndim_permute(*v) should compute or generate a list of tuples like:

ndim_permute( (0,1,2), (0,1), (0,1), ) ->

0 0 0
0 0 1
0 0 2
0 1 0
0 1 1
0 1 1
1 0 1
.....
what is a good solution? Or is there already a total iterator existing somewhere in the stdlib?
robert
Nov 20 '06 #1
Share this Question
Share on Google+
2 Replies


P: n/a
robert wrote:
for the purpose of flat n-dim iteration a function or generator
ndim_permute(*v) should compute or generate a list of tuples like:

ndim_permute( (0,1,2), (0,1), (0,1), ) ->

0 0 0
0 0 1
0 0 2
0 1 0
0 1 1
0 1 1
hmm ... shouldn't his be (0 1 2) ?
1 0 1
....
what is a good solution? Or is there already a total iterator existing
somewhere in the stdlib?
I think there are good solutions in the python cookbook at:

http://aspn.activestate.com/ASPN/Cookbook/Python

But it gives a page mentioning 'system difficulties' now, so I can't
check. Someone else will post the link to their favorite recipe.
Meanwhile, this gives me a chance to plug some of my experimental code :-)

A.

def ncycle(seq,n):
while True:
for x in seq:
for dummy in xrange(n):
yield x

def cross(*args):
p,R = 1,[]
for arg in args:
L = list(arg)
R.append(ncycle(L,p))
p *= len(L)
R.reverse()
for dummy in xrange(p):
yield tuple(x.next() for x in R)

def test():
for x in cross((0,1,2), (0,1), (0,1)):
print x

if __name__=='__main__':
test()



Nov 20 '06 #2

P: n/a
If your products are not too big you may use the following approach

def cross(*L):
P=[()]
for i in range(len(L)):
P_=[]
for p in P:
for el in L[i]:
P_.append(p+(el,))
P = P_
return P

if __name__ == '__main__':
for x in cross((0,1,2), (0,1), (0,1)):
print x

Nov 20 '06 #3

This discussion thread is closed

Replies have been disabled for this discussion.