获取不重复排列组合

如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)<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,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

本文地址: http://www.chenxm.cc/article/898.html
温馨提示:文章内容系作者个人观点,不代表对观点赞同或支持。
版权声明:本文为转载文章,来源于  None  ,版权归原作者所有,欢迎分享本文,转载请保留出处!
上一篇: xshell 手动控制停止滚屏 禁止滚动
下一篇: mac 百度云破解 不限速下载
发表评论

还没有留言,还不快点抢沙发?