飘逸的python - 解决一个有限制的组合需求
2013-09-05 00:04
190 查看
假设有一个团队技能的需求。
这类技能是要集齐所有指定的人就能激活。
但是因为同一个人又2种身份存在,比如杨戬/神杨戬,于是便产生了组合。
这种组合跟普通组合不一样,普通组合可以随意组合。而这种组合是每个人都必须选,遇2选1。
比如['杨戬/神杨戬','猪八戒']可组合成
['杨戬','猪八戒']
['神杨戬','猪八戒']
但不能组合成['杨戬','神杨戬'].
思路:
只有1种身份的人不会产生组合,是固定的,所以分开处理。
将对人的2选1组合转换二进制0和1的组合。
利用itertools.product(iterable, repeat)特性
下面上代码
import itertools
group = ['杨戬/神杨戬','嫦娥','沉香/神沉香']
skill1 = [x for x in group if '/' not in x]
skill2 = [x.split('/') for x in group if '/' in x]
masks = list(itertools.product([0,1], repeat=len(skill2)))
result = [[s[mask[i]] for i,s in enumerate(skill2)]+skill1 for mask in masks]
import pprint
pprint.pprint(result)
输出:
[['杨戬', '沉香', '嫦娥'],
['杨戬', '神沉香', '嫦娥'],
['神杨戬', '沉香', '嫦娥'],
['神杨戬', '神沉香', '嫦娥']]
这类技能是要集齐所有指定的人就能激活。
但是因为同一个人又2种身份存在,比如杨戬/神杨戬,于是便产生了组合。
这种组合跟普通组合不一样,普通组合可以随意组合。而这种组合是每个人都必须选,遇2选1。
比如['杨戬/神杨戬','猪八戒']可组合成
['杨戬','猪八戒']
['神杨戬','猪八戒']
但不能组合成['杨戬','神杨戬'].
思路:
只有1种身份的人不会产生组合,是固定的,所以分开处理。
将对人的2选1组合转换二进制0和1的组合。
利用itertools.product(iterable, repeat)特性
下面上代码
import itertools
group = ['杨戬/神杨戬','嫦娥','沉香/神沉香']
skill1 = [x for x in group if '/' not in x]
skill2 = [x.split('/') for x in group if '/' in x]
masks = list(itertools.product([0,1], repeat=len(skill2)))
result = [[s[mask[i]] for i,s in enumerate(skill2)]+skill1 for mask in masks]
import pprint
pprint.pprint(result)
输出:
[['杨戬', '沉香', '嫦娥'],
['杨戬', '神沉香', '嫦娥'],
['神杨戬', '沉香', '嫦娥'],
['神杨戬', '神沉香', '嫦娥']]
相关文章推荐
- 飘逸的python - 解决一个有限制的组合需求
- 草根学Python(十五) 闭包(解决一个需求了解闭包流程)
- 生活本身就是解决一个接一个需求的过程
- 基本在每个项目中都会遇到发送邮件的需求,大家熟知的邮箱有新浪、雅虎、QQ、OUTLOOK等,想必大家也遇到过发送邮件总是被发送到垃圾邮箱中,下面是我找到的一个解决办法,仅供参考。
- 【A ByteOf Python2.7】第10章 解决问题——编写一个Python脚本
- Python调用不在同一个文件夹下的Python程序,并且如何解决pyinstaller打包路径问题
- 给定一个数组,求数组中所有元素的可能组合(每个元素只出现一次),使其和等于给定数的解决办法
- 解决一个模式匹配需求
- 一条sql语句解决一个变态需求
- python -m 命令单独运行一个文件,怎么解决单独运行文件报错?
- python 实现双纵轴(y)轴图像的绘制(中文label),解决只显示一个折线label的问题
- 解决文本框中输入字符限制---精确控制中文占两个字节,英文占一个字节~
- 用 Python 的 Descriptor 特性解决一个变态的问题
- iOS tabbar和navigation组合,点击item两次,会pop到上一个页面,解决不让控制器跳转的方法
- 飘逸的python - 一个简单的AST(抽象语法树)
- 飘逸的python - 实现一个极简的优先队列
- Oracle LOCK内部机制及最佳实践系列(三)构想一个使用手工锁定解决一种业务需求的场景
- 给定一个数组,求数组中所有元素的可能组合(每个元素只出现一次),使其和等于给定数的解决办法
- 用 Python 的 Descriptor 特性解决一个变态的问题