排列组合的迭代

问题

你想迭代遍历一个集合中元素的所有可能的排列或组合

解法

itertools 模块提供了三个函数来解决这类问题。 其中一个是itertools.permutations() ,它接受一个集合并产生一个元组序列,每个元组由集合中所有元素的一个可能排列组成。也就是说通过打乱集合中元素排列顺序生成一个元组,比如:

>>> items = ['a', 'b', 'c']
>>> from itertools import permutations
>>> for p in permutations(items):
...     print(p)
...
('a', 'b', 'c')
('a', 'c', 'b')
('b', 'a', 'c')
('b', 'c', 'a')
('c', 'a', 'b')
('c', 'b', 'a')
>>>

如果你想得到指定长度的所有排列,你可以传递一个可选的长度参数。就像这样:

>>> for p in permutations(items, 2):
...     print(p)
...
('a', 'b')
('a', 'c')
('b', 'a')
('b', 'c')
('c', 'a')
('c', 'b')
>>>

使用 itertools.combinations() 可得到输入集合中元素的所有的组合。比如:

>>> from itertools import combinations
>>> for c in combinations(items, 3):
...     print(c)
...
('a', 'b', 'c')
>>> for c in combinations(items, 2):
...     print(c)
...
('a', 'b')
('a', 'c')
('b', 'c')
>>> for c in combinations(items, 1):
...     print(c)
...
('a',)
('b',)
('c',)
>>>

对于 combinations() 来讲,元素的顺序已经不重要了。也就是说,组合 (‘a’,‘b’) 跟 (‘b’, ‘a’) 其实是一样的 (最终只会输出其中一个)。

在计算组合的时候,一旦元素被选取就会从候选中剔除掉(比如如果元素’a’已经被选取了,那么接下来就不会再考虑它了)。而 函数itertools.combinations_with_replacement() 允许同一个元素被选择多次,比如:

>>> for c in combinations_with_replacement(items, 3):
...     print(c)
...
('a', 'a', 'a')
('a', 'a', 'b')
('a', 'a', 'c')
('a', 'b', 'b')
('a', 'b', 'c')
('a', 'c', 'c')
('b', 'b', 'b')
('b', 'b', 'c')
('b', 'c', 'c')
('c', 'c', 'c')
>>>

讨论

尽管你也可以自己手动实现排列组合算法,但是这样做得要花点脑力。当我们碰到看上去有些复杂的迭代问题时,最好可以先去看看 itertools 模块。如果这个问题很普遍,那么很有可能会在里面找到解决方案!

《Python Cookbook 3rd》笔记(4.9):排列组合的迭代相关推荐

  1. 《Python Cookbook 3rd》笔记汇总

    文章目录 一.数据结构 二.字符串和文本 三.数字.日期和时间 四.迭代器与生成器 五.文件与IO 一.数据结构 标题 关键词 1.1:拆分序列后赋值给多个变量 可迭代对象.拆分赋值 1.2:拆分任意 ...

  2. 《Python Cookbook 3rd》笔记(1.4):查找最大或最小的N个元素

    <Python Cookbook 3rd>1.4:查找最大或最小的N个元素 问题 怎样从一个集合中获得最大或者最小的N个元素列表? 解法 heapq 模块有两个函数:nlargest()和 ...

  3. 《Python cookbook》笔记二

    <Python cookbook>笔记二 第二章 字符串和文本 -使用多个界定符分割字符串- 你需要将一个字符串分割为多个字段,但是分隔符 (还有周围的空格) 并不是固定 的. # str ...

  4. Machine Learning with Python Cookbook 学习笔记 第9章

    Chapter 9. Dimensionality Reduction Using Feature Extraction 前言 本笔记是针对人工智能典型算法的课程中Machine Learning w ...

  5. Machine Learning with Python Cookbook 学习笔记 第6章

    Chapter 6. Handling Text 本笔记是针对人工智能典型算法的课程中Machine Learning with Python Cookbook的学习笔记 学习的实战代码都放在代码压缩 ...

  6. Python Cookbook 3rd Edition Documentation

    Python Cookbook 3rd Edition Documentation 文章目录 第一章:数据结构和算法 1.1 解压序列赋值给多个变量 问题 解决方案 讨论 1.2 解压可迭代对象赋值给 ...

  7. Machine Learning with Python Cookbook 学习笔记 第8章

    Chapter 8. Handling Images 前言 本笔记是针对人工智能典型算法的课程中Machine Learning with Python Cookbook的学习笔记 学习的实战代码都放 ...

  8. [python Cookbook]阅读笔记

    @toc] 前记:为了补充一下python语法知识,感谢网友的推荐阅读了pythonCookbook,这本书确实不错,以问题为导向,引导解决思路. 这个博文是从阅读笔记typora中直接复制过来的没有 ...

  9. python计算组合数_Python实现的排列组合计算操作示例

    Python实现的排列组合计算操作示例 本文实例讲述了Python实现的排列组合计算操作.分享给大家供大家参考,具体如下: 1. 调用 scipy 计算排列组合的具体数值 >> from ...

最新文章

  1. todo:DSB and ISB
  2. SAP内向交货详解 Details on SAP inbound delivery
  3. netty依赖_高性能:《一遍文章带你看懂 Netty世界》
  4. ms sql 触发器( 转)
  5. linux单点登录命令,配置RHEV中LINUX 虚拟机使用ACTIVE DIRECTORY(AD域)实现单点登录的方法...
  6. robot framework好的学习网址
  7. 学习SQL:INNER JOIN与LEFT JOIN
  8. Ext JS4百强应用:设置textfield的悬浮提示信息 --第8强
  9. matlab ctrl c,Matlab:实现CTRL + C的功能,但在代码中
  10. Matlab给二维函数图像标注极值点
  11. 计算机网络实验一 验证性实验
  12. 股票量化分析(11)——第二个策略(5日移动均线、双均线、MACD策略)
  13. java数组 处理函数 chunk_数组分组chunk的一种写法
  14. 约瑟夫问题 pku1012(转自奋斗青春(亚伟)blog)
  15. 用MATLAB求解小鸭过河曲线
  16. Table does not have the identity property. Cannot perform SET operation.
  17. 风帆头,旗帜服,“背”在肩上的古国王印
  18. elasticsearch es sum求和统计用法
  19. HDU2550 百步穿杨
  20. 视觉中国财报背后的版权门余波

热门文章

  1. 串口通讯编程一日通1(整合资料) .
  2. Windows CE下流驱动的动态加载
  3. android studio adb 命令行,Android Studio如何配置adb以及经常使用命令
  4. java vo转map_JAVA Map转换为Bean或VO
  5. python time perf_Python Time 的学习笔记
  6. 【转】setsocketopt getsocketopt比较全的参数说明
  7. 【转】什么是ERP、SCM、CRM?
  8. Azure Blob Storage 基本用法 -- Azure Storage 之 Blob
  9. 24组合模式(Composite Pattern)
  10. mq集群要建传输队列吗_面试官:消息队列这些我必问!