获取不重复排列组合
如abc三个元素,取两个相互组合,可重复取的话有,aa ab ac bb bc cc六种,不可重复取有 ab ac bc三种,从结果可以看出:
可重复取特点是,一个组合结果中,后一位元素的在原始序列中的索引大于等于前一位元素在原始原始序列中的索引,a的原始索引为0,b为1,c为2,aa 索引组合为00,ab为01,ac为02,bb为22,bc为23……以此类推。
不可重复取组合的特点是一个组合结果中,后一位元素的在原始序列中的索引大于前一位元素在原始原始序列中的索引。ab 索引组合01,ac 为03,bc为13。
第一种写法:
使用itertools.combinations(iterable,r)
对于combinations()来说,元素之间的实际顺序是不作考虑的,组合('a','b')和('b','a')被认为是相同的组合形式。
#### python2 import itertools for i in itertools.combinations('ABCD', 3): print (''.join(i),) >>> ABC ABD ACD BCD #### python3 import itertools for i in itertools.combinations('ABCD',end=' ') >>> ABC ABD ACD BCD
end=' '可以让默认的输出后换行变为一个空格
第二种写法:
def getCombinations(array=[],m=0): allAns = [] #用来存储所有递归中的子列表 ans = [None for i in range(m)] #预先填充m个None,用来存储每次递归中的子列表 combinations(array,m,ans,allAns) return allAns def combinations(array=[],m=0,ans=[],allAns=[]): # recursive function codes if m==0: # m==0是某次递归返回的条件之一:子列表的第三个数已经选出。 # 意味着已到达某个方向的最大递归深度 print('allAns is ',allAns,'before append ans:',ans) allAns.append(ans.copy()) #这里有意思了,如果不用copy,那么ans即使已经存储在allAns,也会被其它递归方向中的ans刷新 print('allAns is ', allAns, 'after append ans:', ans) return if len(array)<m: # 递归函数直接返回的条件之一:从4个数里面选5个数出来是不可能的。 print("short arrayt!") return length=len(array) for iter in range(length-m+1): #可以作为子列表一员的数在array中的index ans[-m]=array[iter] #array[iter]作为子列表倒数第m个数 if iter+1<length: #可以调用递归函数的条件:保证array[iter+1:]里面还有东东才行 subarrayts(array[iter+1:],m-1,allAns) else: print('allAns is ', 'before append ans:', ans) allAns.append(ans.copy()) print('allAns is ', ans) return liss=[1,2,3,4] m=3 print(getSubLists(liss,m)) >>> [[1, 2, 3], [1, 4], 3, [2, 4]]
获取可重复的排列组合
笛卡尔积:itertools.product(*iterables[,repeat])
#### python3 import itertools for i in itertools.product('ABCD', repeat = 2): print (''.join(i),end=' ') #### python2 import itertools for i in itertools.product('ABCD',) >>> AA AB AC AD BA BB BC BD CA CB CC CD DA DB DC DD
排列:itertools.permutations(iterable[,r])
将其中的元素排列为所有可能的情况,并以元组序列的形式返回
import itertools for i in itertools.permutations('ABCD', 2): print (''.join(i),end=' ') >>> AB AC AD BA BC BD CA CB CD DA DB DC
包含自身重复 itertools.combinations_with_replacement(iterable,r)
import itertools for i in itertools.combinations_with_replacement('ABCD',end=' ') >>> AAA AAB AAC AAD ABB ABC ABD ACC ACD ADD BBB BBC BBD BCC BCD BDD CCC CCD CDD DDD
参考:
https://www.jianshu.com/p/f46b10585f9d
https://zhuanlan.zhihu.com/p/42052976