How to generate permutations of a list without “reverse duplicates” in Python using generators

后端 未结 10 1102
情歌与酒
情歌与酒 2020-12-03 12:09

This is related to question How to generate all permutations of a list in Python

How to generate all permutations that match following criteria: if

10条回答
  •  独厮守ぢ
    2020-12-03 12:42

    EDIT: changed completely to keep everything as a generator (never the whole list in memory). Should fulfill the requirements (only calculates half of the possible permutations (not the reverse ones). EDIT2: added shorter (and simpler) factorial function from here.

    EDIT3:: (see comments) - a version with improvements can be found in bwopah's version.

    def fac(x): 
        return (1 if x==0 else x * fac(x-1))
    
    def all_permutations(plist):
        global counter
    
        if len(plist) <=1:
            yield plist
        else:
            for perm in all_permutations(plist[1:]):
                for i in xrange(len(perm)+1):
                    if len(perm[:i] + plist[0:1] + perm[i:]) == lenplist:
                            if counter == limit:
                                 raise StopIteration
                            else:
                                 counter = counter + 1
                    yield perm[:i] + plist[0:1] + perm[i:]
    
    counter = 0
    plist = ['a','b','c']
    lenplist = len(plist)
    limit = fac(lenplist) / 2
    
    all_permutations_gen = all_permutations(plist)
    print all_permutations_gen
    print list(all_permutations_gen)
    

提交回复
热议问题