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 生成排列、组合以及选择的更多相关文章

  1. python编写排列组合,密码生产功能

    python编写排列组合 python在编写排列组合是会用到  itertools 模块 排列 import itertools mylist = list(itertools.permutation ...

  2. 【Python】排列组合itertools & 集合set

    ■itertools 利用python的itertools可以轻松地进行排列组合运算 itertools的方法基本上都返回迭代器 比如 •itertools.combinations('abcd',2 ...

  3. python 实现排列组合

    1.python语言简单.方便,其内部可以快速实现排列组合算法,下面做简单介绍. 2.一个列表数据任意组合 2.1主要是利用自带的库 #_*_ coding:utf-8 _*_ #__author__ ...

  4. python 编写排列组合

    python在编写排列组合是会用到  itertools 模块 排列 import itertools mylist = list(itertools.permutations([)) # 全排列 p ...

  5. Python实现排列组合

    # -*- coding: utf-8 -*-"""Created on Sat Jun 30 11:49:56 2018 @author: zhen"&quo ...

  6. python算法-排列组合

    排列组合 一.递归 1.自己调用自己 2.找到一个退出的条件 二.全排列:针对给定的一组数据,给出包含所有数据的排列的组合 1:1 1,2:[[1,2],[2,1]] 1,2,3:[[1,2,3],[ ...

  7. python之排列组合测试

    # test permutations and combinations import itertools as it for i in it.combinations('abcd',2): prin ...

  8. python解决排列组合

    笛卡尔积:itertools.product(*iterables[, repeat]) import itertools for i in itertools.product('BCDEF', re ...

  9. poj 1146 ID Codes (字符串处理 生成排列组合 生成当前串的下一个字典序排列 【*模板】 )

    ID Codes Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6229   Accepted: 3737 Descript ...

随机推荐

  1. tcp_tw_recycle和tcp_timestamps的文章汇总

        临近年关,人会变得浮躁,期间写的代码可谓乱七八糟.不过出来混始终是要还的,这不最近就发现一个PHP脚本时常连不上服务器. 遇到这类问题,我习惯于先用strace命令跟踪了一下看看: shell ...

  2. nginx rewrite 参数和例子

    http://www.cnblogs.com/analyzer/articles/1377684.html ] 本位转自:http://blog.c1gstudio.com/archives/434 ...

  3. 对比AppScan Source和Fortify扫描AltoroJ的结果

    对比AppScan Source和Fortify扫描AltoroJ的结果: http://blog.csdn.net/testing_is_believing/article/details/1963 ...

  4. [转]ODBC连接ORACLE数据库的设置

    本文转自:http://www.cppblog.com/edog/articles/1420.html 首先安装Oracle,以Oracle 817为例,作为ODBC开发者的客户端,才能使用Oracl ...

  5. 关于egit的日常操作总结

    $git fetch -p --prune -p -- remove any remote tracking branches that no longer exist remotely prune的 ...

  6. HashMap(JDK1.8)源码剖析

    在JDK1.6中,HashMap采用位桶+链表实现,即使用链表处理冲突,同一hash值的Entity都存储在一个链表里.但是当位于一个桶中的元素较多,即hash值相等的元素较多时,通过key值依次查找 ...

  7. 滑动条slider

    #include"ui/CocosGUI.h" using namespace ui; Text* displayValudLabel = Text::create("轻 ...

  8. yii下使用oracle中文都变成问号乱码的解决方法

    在配置文件中,一般会用以下配置: 'db_oracle'=>array( 'class' => 'CDbConnection', 'connectionString'=>'oci:d ...

  9. PHP之会话控制小结

    会话控制是一种跟踪用户的通信方式,使用会话控制主要基于以下几点:由于http协议的无状态性,使得不能通过协议来建立两次请求之间的关联:对于通常的页面之间的数据传递方式get和post而言,主要处理参数 ...

  10. Spring之IOC容器初始化过程

    Ioc容器的初始化是由refresh()方法来启动的,这个方法标志着Ioc容器的正式启动. 具体来说这个启动过程包括三个基本过程: 1.BeanDifinition的Resource定位 2.Bean ...