我有一个真正的大脑试图解决这个问题。我正在尝试编写一个函数,该函数将返回列表的所有排列,并与一些特殊值交错。

函数签名:

def interleaved_permutations(values, num_special_values)


一个例子:

>>> interleaved_permutations([1,2,3,4], 2)
[1,x,x,2,3,4]
[1,x,2,x,3,4]
[1,x,2,3,x,4]
[1,2,x,x,3,4]
...


另一个要求是,特殊值不能在列表中位于第一位或最后一位。

我知道一定有某种疯狂的itertools foo的方法,但是我还无法远程提出任何建议。我得到的最接近的只是使用itertools.permutations获取输入值的排列

我希望有人比我更精通pythonic!

最佳答案

一种方法是在插入后使用itertools.combinations选择特殊值的位置:

from itertools import permutations, combinations

def interleaved(values, num_special_values):
    width = len(values) + num_special_values
    special = 'x'
    for perm in permutations(values):
        for pos in combinations(range(1, width-1), num_special_values):
            it = iter(perm)
            yield [special if i in pos else next(it)
                   for i in range(width)]


这给了我

In [31]: list(interleaved([1,2,3], 2))
Out[31]:
[[1, 'x', 'x', 2, 3],
 [1, 'x', 2, 'x', 3],
 [1, 2, 'x', 'x', 3],
 [...]
 [3, 'x', 'x', 2, 1],
 [3, 'x', 2, 'x', 1],
 [3, 2, 'x', 'x', 1]]




In [32]: list(interleaved([1,2,3,4], 2))
Out[32]:
[[1, 'x', 'x', 2, 3, 4],
 [1, 'x', 2, 'x', 3, 4],
 [1, 'x', 2, 3, 'x', 4],
 [...]
 [4, 3, 'x', 2, 'x', 1],
 [4, 3, 2, 'x', 'x', 1]]

10-04 21:47