python 生成排列、组合以及选择

from <python cookbook> 19.15

  任务

  需要对一个序列的排列(permutation)、组合(combination)或选择(selection)进行迭代操作。即使初始的序列长度并不长,组合计算的规则却显示生成的序列可能非常庞大,比如一个长度为13的序列有超过60亿种可能的排列。所以,你肯定不希望在开始迭代前计算并生成序列中的所有项

  解决方案

  生成器允许你在迭代的时候一次一个的计算需要的对象。如果有很多这种对象,而且你也必须逐个的检查他们,那么程序无可避免的会用很长时间才能完成循环。但至少你不用浪费很多内存来保存所有项:

def _combinators(_handle, items, n):
    ‘‘‘ 抽取下列组合的通用结构‘‘‘
    if n == 0:
        yield [ ]
    for i, item in enumerate(items):
        this_one = [item]
        for cc in _combinators(_handle, _handle(items, i), n-1):
            yield this_one + cc

def combinations(items, n):
     ‘‘‘ 取得n个不同的项, 顺序是有意义的‘‘‘
    def skipIthItem(items, i):
        return items[:i] + items[i + 1:]
    return _combinators(skipIthItem, items, n)

def uniqueCombinations(items, n):
    ‘‘‘取得n个不同的项,顺序无关‘‘‘
    def afterIthItem(items, i):
        return items[i+1:]
    return _combinators(afterIthItem, items, n)

def selections(items, n):
    ‘‘‘取得n项(不一定要不同),顺序是有意义的‘‘‘
    def keepAllItems(items, i):
        return items
    return _combinators(keepAllItems, items, n)

def permutations(items):
    ‘‘‘ 取得所有项, 顺序是有意义的‘‘‘
    return combinations(items, len(items))

if __name__ == ‘__main__‘:
    print "Permutations of ‘bar‘"
    print map(‘‘.join, permutations(‘bar‘))
#输出: [‘bar‘, ‘bra‘, ‘abr‘, ‘arb‘, ‘rba‘, ‘rab‘]

    print "Combinations of 2 letters from ‘bar‘"
    print map(‘‘.join, combinations(‘bar‘, 2))
# 输出: [‘ba‘, ‘br‘, ‘ab‘, ‘ar‘, ‘rb‘, ‘ra‘]

    print "Unique Combinations of 2 letters from ‘bar‘"
    print map(‘‘.join, uniqueCombinations(‘bar‘, 2))
# 输出: [‘ba‘, ‘br‘, ‘ar‘]

    print "Selections of 2 letters from ‘bar‘"
    print [‘‘.join, selections(‘bar‘, 2)]
# 输出: [‘bb‘, ‘ba‘, ‘br‘, ‘ab‘, ‘aa‘, ‘ar‘, ‘rb‘, ‘ra‘, ‘rr‘]
时间: 2024-11-10 01:47:04

python 生成排列、组合以及选择的相关文章

python 实现排列组合

1.python语言简单.方便,其内部可以快速实现排列组合算法,下面做简单介绍. 2.一个列表数据任意组合 2.1主要是利用自带的库 #_*_ coding:utf-8 _*_ #__author__='dragon' import itertools list1 = [1,2,3,4,5] list2 = [] for i in range(1,len(list1)+1): iter = itertools.combinations(list1,i) list2.append(list(ite

python 编写排列组合

python在编写排列组合是会用到  itertools 模块 排列 import itertools mylist = list(itertools.permutations(['A','B','C','D'],4)) # 全排列 print(mylist) mylist1 = list(itertools.permutations(['A','B','C','D'],3)) # 4个里面选3个排列 print(mylist1) #5!=1*2*3*4*5 #0!=1 #M个选N个 M!/(M

python解决排列组合

笛卡尔积:itertools.product(*iterables[, repeat]) import itertools for i in itertools.product('BCDEF', repeat = 2): print(''.join(i),end=",") print('\n') # 输出 BB BC BD BE BF CB CC CD CE CF DB DC DD DE DF EB EC ED EE EF FB FC FD FE FF 两个元组进行笛卡尔积: impo

【原创】开源.NET排列组合组件KwCombinatorics使用(二)——排列生成

你还可以参考本博客其他.NET开源项目的相关文章: [原创]彩票预测算法:离散型马尔可夫链模型          Newlife XCode组件资源目录汇总[2013年版] [原创]开源.NET下的XML数据库介绍及入门          [原创].NET开源压缩组件介绍与入门 [开源].NET开源表达式计算组件介绍与使用          [原创]开源Word读写组件DocX介绍与入门 [原创]Matlab.NET混编调用Figure窗体                [原创]Matlab与.

【原创】开源.NET排列组合组件KwCombinatorics使用(一)——生成组合序列

你还可以参考本博客其他.NET开源项目的相关文章: [原创]彩票预测算法:离散型马尔可夫链模型          Newlife XCode组件资源目录汇总[2013年版] [原创]开源.NET下的XML数据库介绍及入门          [原创].NET开源压缩组件介绍与入门 [开源].NET开源表达式计算组件介绍与使用          [原创]开源Word读写组件DocX介绍与入门 [原创]Matlab.NET混编调用Figure窗体                [原创]Matlab与.

【原创】开源.NET排列组合组件KwCombinatorics使用(三)——笛卡尔积组合

你还可以参考本博客其他.NET开源项目的相关文章: [原创]彩票预测算法:离散型马尔可夫链模型          Newlife XCode组件资源目录汇总[2013年版] [原创]开源.NET下的XML数据库介绍及入门          [原创].NET开源压缩组件介绍与入门 [开源].NET开源表达式计算组件介绍与使用          [原创]开源Word读写组件DocX介绍与入门 [原创]Matlab.NET混编调用Figure窗体                [原创]Matlab与.

排列组合(包括n中随机抽取m个)

有些情况我们需要获取一个数组中的所有排列组合情况,或者获取一部分数据进行随机组合,这个在python中有一个模块可以实现.具体情况如下 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: permutations()可以用来生成排列组合的所有样式参数可以有一个也可以有两个,一个list输出排列组合,两个参数[list,n]表示从list中随机选出n个元素的所有情况 实例: print(list(

减一技术应用:生成排列与幂集(Java实现)

减一技术,与二分搜索一样,是一种通用算法设计技术.它是分治法的一种特殊形式,通过建立问题实例P(n) 与问题实例P(n-1)的递推求解关系式而实现:最经典的例子莫过于插入排序了.这里,给出减一技术在生成排列组合方面的应用. (一)  排列问题: 生成自然数 1,2,,,,,n 的所有排列. 算法描述: 使用减一技术,建立自然数12...n的排列与12...n-1的递推关系.假设 P(n-1) 是 自然数 12...n-1的所有排列 p1, p2,..., p(m)的集合,则P(n)通过如下方式得

Python算法题(二)——国际象棋棋盘(排列组合问题,最小的K个数)

题目一(输出国际象棋棋盘)  分析: 用i控制行,j来控制列,根据i+j的和的变化来控制输出黑方格,还是白方格.   主要代码: for i in range(8): for j in range(8): if (i+j)%2!=0: print(chr(219)*2,end='') else: print(' ',end='') print('') 题目二(排列组合问题)   有1.2.3.4个数字,能组成多少个互不相同且无重复数字的四位数?都是多少?   分析:  我们可以先预测一下,共有2