首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > perl python >

飘逸的python - 解决一个有限制的结合需求

2013-09-07 
飘逸的python - 解决一个有限制的组合需求假设有一个团队技能的需求。这类技能是要集齐所有指定的人就能激

飘逸的python - 解决一个有限制的组合需求
假设有一个团队技能的需求。
这类技能是要集齐所有指定的人就能激活。
但是因为同一个人又2种身份存在,比如杨戬/神杨戬,于是便产生了组合。
这种组合跟普通组合不一样,普通组合可以随意组合。而这种组合是每个人都必须选,遇2选1。
比如['杨戬/神杨戬','猪八戒']可组合成
['杨戬','猪八戒']
['神杨戬','猪八戒']
但不能组合成['杨戬','神杨戬'].

思路:
只有1种身份的人不会产生组合,是固定的,所以分开处理。
将对人的2选1组合转换二进制0和1的组合。
利用itertools.product(iterable, repeat)特性

下面上代码

import itertoolsgroup = ['杨戬/神杨戬','嫦娥','沉香/神沉香']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 pprintpprint.pprint(result)

输出:

[['杨戬', '沉香', '嫦娥'],
 ['杨戬', '神沉香', '嫦娥'],
 ['神杨戬', '沉香', '嫦娥'],
 ['神杨戬', '神沉香', '嫦娥']]

热点排行