python实现不重复排列组合_python 生成不重复和可重复的排列组合

获取不重复排列组合

如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', 3):

print (''.join(i),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)

# 递归函数直接返回的条件之一:从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

subarrayts(array[iter+1:],m-1,ans,allAns)

else:

print('allAns is ', allAns, 'before append ans:', ans)

allAns.append(ans.copy())

print('allAns is ', allAns, 'after append ans:', ans)

return

liss=[1,2,3,4]

m=3

print(getSubLists(liss,m))

>>> [[1, 2, 3], [1, 2, 4], [1, 3, 4], [2, 3, 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', repeat = 2):

print (''.join(i),)

>>> 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', 3):

print (''.join(i),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

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值