方式1:
#!/usr/bin/env python#-*- encoding: utf-8 -*-def permutations(iterable, r=None): # permutations('ABCD', 2) --> AB AC AD BA BC BD CA CB CD DA DB DC # permutations(range(3)) --> 012 021 102 120 201 210 pool = tuple(iterable) n = len(pool) r = n if r is None else r if r > n: return indices = range(n) cycles = range(n, n-r, -1) yield tuple(pool[i] for i in indices[:r]) while n: for i in reversed(range(r)): cycles[i] -= 1 if cycles[i] == 0: indices[i:] = indices[i+1:] + indices[i:i+1] cycles[i] = n - i else: j = cycles[i] indices[i], indices[-j] = indices[-j], indices[i] print indices yield tuple(pool[i] for i in indices[:r]) break else: returnfor x in permutations(xrange(1,6),3): print x
方式2:
#/usr/bin/env python
# -*-encoding:utf-8 -*-http://blog.csdn.net/wklken/article/details/8453107from time import time#生成全排列def perm(items, n=None): lg=len(items) r=n if n is not None else lg for i in xrange(lg): v = items[i:i + 1] if r == 1: yield v else: rest = items[:i] + items[i + 1:] for p in perm(rest, r - 1): yield v + p#生成组合 def comb(items, n=None): if n is None: n = len(items) for i in xrange(len(items)): v = items[i:i + 1] if n == 1: yield v else: rest = items[i + 1:] for c in comb(rest, n - 1): yield v + c if __name__=='__main__': t=time() for i in perm(range(1,20),3): print i print 'use time:',time()-t
#!/usr/bin/env python
# -*- encoding:utf-8 -*-from time import timedef permutations(lst,n=None): num=len(lst) if num<n: print 'n is more than the length of list' return else: r= num if n is None else n tmp=range(num)#用tmp值的下标对应mytup的值 cyc=range(num,num-r,-1)#用于循环,保证选出次数 yield [lst[i] for i in tmp[:r]] while 1: for i in reversed(range(r)): cyc[i]-=1 if cyc[i]==0: tmp[i:]=tmp[i+1:]+tmp[i:i+1] cyc[i] =num - i else: j=cyc[i] tmp[i],tmp[-j]=tmp[-j],tmp[i] yield [lst[i] for i in tmp[:r]] break else: returnif __name__=='__main__': t=time() for x in permutations(xrange(1,20),3): print x print "total run time:",time()-t