排列与特殊值交错

时间:2018-04-20 23:06:40

标签: python python-3.x permutation python-3.6

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

功能签名:

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能够提供帮助!

2 个答案:

答案 0 :(得分:2)

一种方法是在插入后使用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]]

答案 1 :(得分:0)

只需从排列列表中过滤掉不良排列:

>>> from itertools import permutations
>>> l = [1, 2, 3, 4]
>>> s = ['x', 'y']
>>> def good(x):
...     return x[0] not in s and x[-1] not in s
...
>>> print(*filter(good, permutations(l+s)), sep='\n')
(1, 2, 3, 'x', 'y', 4)
(1, 2, 3, 'y', 'x', 4)
(1, 2, 4, 'x', 'y', 3)
(1, 2, 4, 'y', 'x', 3)
(1, 2, 'x', 3, 'y', 4)
(1, 2, 'x', 4, 'y', 3)
(1, 2, 'x', 'y', 3, 4)
(1, 2, 'x', 'y', 4, 3)
(1, 2, 'y', 3, 'x', 4)
(1, 2, 'y', 4, 'x', 3)
(1, 2, 'y', 'x', 3, 4)
(1, 2, 'y', 'x', 4, 3)
...
(4, 'y', 'x', 2, 3, 1)
(4, 'y', 'x', 3, 1, 2)
(4, 'y', 'x', 3, 2, 1)
>>>