python 生成排列、组合以及选择
2015-07-11 15:55
645 查看
from <python cookbook> 19.15
任务
需要对一个序列的排列(permutation)、组合(combination)或选择(selection)进行迭代操作。即使初始的序列长度并不长,组合计算的规则却显示生成的序列可能非常庞大,比如一个长度为13的序列有超过60亿种可能的排列。所以,你肯定不希望在开始迭代前计算并生成序列中的所有项
解决方案
生成器允许你在迭代的时候一次一个的计算需要的对象。如果有很多这种对象,而且你也必须逐个的检查他们,那么程序无可避免的会用很长时间才能完成循环。但至少你不用浪费很多内存来保存所有项:
任务
需要对一个序列的排列(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常用函数(一)
- Python学习笔记—itertools模块
- python修改字典内key对应值的方法
- 在目录及其子目录下寻找匹配的文件的python实现
- 【Python 学习手册笔记】数字
- python字典基本操作实例分析
- python使用clear方法清除字典内全部数据实例
- 初学python、Django
- ZH奶酪:编程语言入门经典100例【Python版】
- pycharm中python编码问题解决
- Coursera Ng机器学习课练习一之python版
- Python中的引用
- python报错ordinal not in range(128)
- python提取字典key列表的方法
- python字符串对其居中显示的方法
- python实现在字符串中查找子字符串的方法
- python检查字符串是否是正确ISBN的方法
- Python读取Excel的方法实例分析
- 总结python抽象类和抽象方法的写法
- Python的ABC模块