码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-07-11 16:35:54      阅读:139      评论:0      收藏:0      [点我收藏+]

标签:

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‘]

 

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

标签:

原文地址:http://www.cnblogs.com/siriuswang/p/4638816.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!