有一个关于使用permutationsitertools 库中的函数进行条件生成的问题:
有如下代码:
combinations = list(itertools.permutations([1, 2, 3], 3))
其执行结果我们得到:
(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)
这些都是给定数字组合的所有可能变化。是否可以生成(即生成,而不是显示所有已生成的变量中所需的变量)指示它们应该开始的条件的特定变量?也就是说,像这样:
combinations = list(itertools.permutations([1, 2, 3], 3, only 1)
结果:
(1, 2, 3), (1, 3, 2)
注意:这个想法已经在评论中描述过。在我看来,我只想给出正确的实现。
我们将“第一个值”从列表中排除(如果存在)。我们生成没有它的排列,将其添加到每个排列的开头:
由于 itertools 不允许您进入生成器并添加检查,因此您需要自己制作。
以下是如何使用部分排列测试来制作排列生成器。
生成器递归地构建排列:
谓词接收排列前缀并返回三个值之一:
我将从示例开始:
四个元素的所有排列:
所有不以“A”开头的排列
“B”在“C”之前的所有排列。
以“C”结尾的排列除外
重新排列者
和一个包装函数
亚历山大·巴拉金(aleksandr barakin)评论中同一主题的变体,纯粹是出于
itertools美观的目的,没有检查,我们假设该函数已经通过提前将数字与列表分开来以所需的方式调用,并且生成器获得生成器,以节省内存并在必要时保存提前终止:结论:
更新:我已经做了额外的事情,它更简单:
这实际上可以归结为斯坦尼斯拉夫·沃洛达尔斯基的回答,只是没有检查。好吧,我将把它作为一个应用示例
cycle,chain以防它对某人派上用场。