
#from __future__ import generators
"""xpermutations.py
Generators for calculating a) the permutations of a sequence and
b) the combinations and selections of a number of elements from a
sequence. Uses Python 2.2 generators.

Similar solutions found also in comp.lang.python

Keywords: generator, combination, permutation, selection

See also: http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/105962
See also: http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/66463
See also: http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/66465
"""


def xcombinations(items, n):
    if n==0: yield []
    else:
        for i in xrange(len(items)):
            for cc in xcombinations(items[:i]+items[i+1:],n-1):
                yield [items[i]]+cc

def xuniqueCombinations(items, n):
    if n==0: yield []
    else:
        for i in xrange(len(items)):
            for cc in xuniqueCombinations(items[i+1:],n-1):
                yield [items[i]]+cc

def xselections(items, n):
    if n==0: yield []
    else:
        for i in xrange(len(items)):
            for ss in xselections(items, n-1):
                yield [items[i]]+ss

def xpermutations(items):
    return xcombinations(items, len(items))

#if __name__=="__main__":
    #print "Permutations of 'love'"
    #for p in xpermutations(['l','o','v','e']): print ''.join(p)

    #print
print "Combinations of 2 letters from 'love'"
    #for c in xcombinations(['l','o','v','e','a','b','c','d','1','2'],4): print ''.join(c)
c= xcombinations(['l','o','v','e','a','b','c','d','1','2'],4)
for x in  c:
	print ''.join(x)

    #print
    #print "Unique Combinations of 2 letters from 'love'"
    #for uc in xuniqueCombinations(['l','o','v','e'],2): print ''.join(uc)

    #print
    #print "Selections of 2 letters from 'love'"
    #for s in xselections(['l','o','v','e'],2): print ''.join(s)

    #print
    #print map(''.join, list(xpermutations('abcdefghijklmn')))
