Python中使用itertools.permutations生成列表全量及部分元素排列
批量生成列表任意长度部分排列的实现方案
你当前使用的itertools.permutations本身就支持部分排列生成,不需要额外实现复杂逻辑,具体用法如下:
itertools.permutations的原生参数支持指定排列长度:函数完整形式为itertools.permutations(iterable, r=None),当传入第二个参数r时,会直接生成输入可迭代对象中、长度为r的所有不重复元素排列,完全匹配你需要的部分排列效果- 如果需要批量覆盖所有可能的部分长度(从长度1到列表最大长度),只需要循环遍历所有合法的r值,将各长度的排列结果合并即可
可直接运行的示例代码
import itertools l = ['water', 'park', 'kit'] partial_perm_result = [] # 遍历从长度1到列表总长度的所有排列长度 for length in range(1, len(l) + 1): partial_perm_result.extend(itertools.permutations(l, length))
结果说明
运行上述代码会得到覆盖所有长度的排列集合:
- 长度1的排列结果:
('water',), ('park',), ('kit',) - 长度2的排列结果:
('water', 'park'), ('water', 'kit'), ('park', 'water'), ('park', 'kit'), ('kit', 'water'), ('kit', 'park') - 长度3的排列结果:就是你之前已经获取到的全排列结果
注意:Python中单元素元组必须带尾随逗号,你举的示例中写的
('water')本质和字符串'water'等价,并不是合法的元组类型,实际生成结果里单元素排列会自动带上逗号,符合元组的类型规范。
如果只需要特定长度的部分排列,不需要生成所有长度,直接给itertools.permutations传入对应r值即可,比如只要长度为2的排列,直接调用itertools.permutations(l, 2)就能拿到对应结果。
内容的提问来源于stack exchange,提问作者N Raghu
相关产品推荐
相关产品推荐

