[EMAIL PROTECTED] wrote: > hi, > > I'm not sure why this hasn't come up yet, but this seems to beg for > list comprehensions, if not generator expressions. All of the > following run in under 2 seconds on my old laptop: > > >>> alph = 'abcdefghijklmnopqrstuvwxyz' > >>> len([''.join((a,b,c,d)) for a in alph for b in alph for c in alph for d > >>> in alph]) > 456976 > >>> len([''.join((a,b,c,d)) for a in alph for b in alph for c in alph for d > >>> in alph > ... if (a>=b and b>=c and c>=d)]) > 23751 > >>> len([''.join((a,b,c,d)) for a in alph for b in alph for c in alph for d > >>> in alph > ... if (a!=b and b!=c and c!=d and d!=a and b!=d and a!=c)]) > 358800 > >>> len([''.join((a,b,c,d)) for a in alph for b in alph for c in alph for d > >>> in alph > ... if (a>b and b>c and c>d)]) > 14950
Well, _I_ was using them in my original program to create the conditionals, but not for the loops. So if we combine your idea to use list comprehensions for the loop with my list comprehensions of the conditionals, we aren't limited to asking for only 4-letter words. And it runs faster than my original. Thanks. def ooloop6(a, n, perm=True, repl=True): if (not repl) and (n>len(a)): return r0 = range(n) r1 = r0[1:] if perm and repl: # ok v = ','.join(['c%s' % i for i in r0]) f = ' '.join(['for c%s in a' % i for i in r0]) e = ''.join(["p = [''.join((",v,")) ",f,"]"]) exec e return p if (not perm) and repl: # ok v = ','.join(['c%s' % i for i in r0]) f = ' '.join(['for c%s in a' % i for i in r0]) i = ' and '.join(['(c%s>=c%s)' % (j,j-1) for j in r1]) e = ''.join(["p = [''.join((",v,")) ",f," if ",i,"]"]) exec e return p if perm and (not repl): # ok v = ','.join(['c%s' % i for i in r0]) f = ' '.join(['for c%s in a' % i for i in r0]) i = ' and '.join([' and '.join(['(c%s!=c%s)' % (j,k) for k in range(j)]) for j in r1]) e = ''.join(["p = [''.join((",v,")) ",f," if ",i,"]"]) exec e return p if (not perm) and (not repl): # ok v = ','.join(['c%s' % i for i in r0]) f = ' '.join(['for c%s in a' % i for i in r0]) i = ' and '.join(['(c%s>c%s)' % (j,j-1) for j in r1]) e = ''.join(["p = [''.join((",v,")) ",f," if ",i,"]"]) exec e return p p = ooloop6('abcdefghijklmnopqrstuvwxyz',4,True,True) print print len(p) p = ooloop6('abcdefghijklmnopqrstuvwxyz',4,False,True) print print len(p) p = ooloop6('abcdefghijklmnopqrstuvwxyz',4,True,False) print print len(p) p = ooloop6('abcdefghijklmnopqrstuvwxyz',4,False,False) print print len(p) """ 456976 23751 358800 14950 """ > > cheers, > Jess -- http://mail.python.org/mailman/listinfo/python-list