Creating unique combinations from lists

Tim Chase python.list at tim.thechases.com
Wed Jan 16 23:22:56 CET 2008


>> I could do nested for ... in loops, but was looking for a Pythonic way
>> to do this.  Ideas?
> 
> What makes you think nested loops aren't Pythonic?

On their own, nested loops aren't a bad thing.  I suspect they 
become un-Pythonic when they make code look ugly and show a 
broken model of the problem.  There's a big diffence between:

   # iterate over a 10x10 grid
   for i in xrange(10):
     for j in xrange(10):
       print i,j

which is pretty manageable, but quickly becomes very unpythonic 
if the problem is poorly defined:

  for a in range(5):
   for b in range(5):
    for c in range(5):
     for d in range(5):
      for e in range(5):
       for f in range(5):
        for g in range(5):
         for h in range(5):
          for i in range(5):
           for j in range(5):
            for k in range(5):
             for l in range(5):
              for m in range(5):
               for n in range(5):
                for o in range(5):
                 for p in range(5):
                  for q in range(5):
                   for r in range(5):
                    for s in range(5):
                     for t in range(5):
                      for u in range(5):
                       for v in range(5):
                        for w in range(5):
                         for x in range(5):
                          for y in range(5):
                           for z in range(5):
                            print a,b,c,d,e,f,g,
                            print h,i,j,k,l,m,n,
                            print o,p,q,r,s,t,u,
                            print v,w,x,y,z

It gets even worse if your loop nesting is based on something 
external.  You wouldn't want code that looks like

   if len(input) == 2:
     for a in range(5):
       for b in range(5):
         whatever(a,b)
   elif len(input) == 3:
     for a in range(5):
       for b in range(5):
         for c in range(5):
           whatever(a,b,c)
   elif len(input) == 4:
   ...

Contributing to the unpythonic'ness (unpythonicity?) of it is 
that something is clearly happening at a higher level than just 
for-loops so other Python constructs should be used to express 
them instead of abusing your code to do your dirty work.

-tkc









More information about the Python-list mailing list