我正在尝试解决这个问题。我正在尝试编写一个函数,它将返回列表的所有排列,并与一些特殊值交错。
功能签名:
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能够提供帮助!
答案 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)
>>>