zoukankan      html  css  js  c++  java
  • 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']
  • 相关阅读:
    safenet 超级狗 java调用 小计
    解析Javascript中大括号“{}”的多义性
    openlayers研究(一) 初始化流程
    计算球面两点间距离实现Vincenty+Haversine
    搭建高可用mongodb集群(四)—— 分片
    搭建高可用mongodb集群(三)—— 深入副本集内部机制
    搭建高可用mongodb集群(二)—— 副本集
    C# 7.1 的 Async Main()
    深入理解 C# 7.1 提供的 async 非同步 Main() 方法
    使用Blazor Server 线路处理程序 (circuit handler)跟踪打开的SignalR连接
  • 原文地址:https://www.cnblogs.com/siriuswang/p/4638816.html
Copyright © 2011-2022 走看看