如何递归地组合(链)列表?

时间:2017-03-12 04:37:31

标签: python algorithm python-3.x recursion permutation

由于某些原因,我在绕递归算法时遇到了麻烦......

我想知道是否有人可以帮我提出以下的递归版本:

我有一个数字列表列表,我希望得到所有元素排列的所有可能列表。

例如,给定[[1], [2,3], [4,5]],我希望输出为:

[[1,2,3,4,5], [1,2,3,5,4], [1,3,2,4,5], [1,3,2,5,4]]

我这样做的方式很难看:

l = (my list)
perms = [list(permutations(i)) for i in l]
p = perms[0]
for i in range(1, len(perms)):
    p = list(map(lambda x: list(chain.from_iterable(x)), list(product(p, perms[i]))))
    i += 1
print(p)

我不喜欢它...我觉得递归可能更优雅。 有什么想法吗?

2 个答案:

答案 0 :(得分:3)

你可以简化一堆事情。只需将所有排列迭代器传递给itertools.product,然后展平您获得的列表列表:

my_list = [[1], [2,3], [4,5]]
perms = [permutations(x) for x in my_list]
result = [list(chain.from_iterable(product)) for product in product(*perms)]

答案 1 :(得分:3)

您可以简化代码而无需递归:

>>> from itertools import chain, product, permutations
>>> l = [[1], [2,3], [4,5]]
>>> perms = [list(permutations(x)) for x in l]
>>> [list(chain.from_iterable(xs)) for xs in product(*perms)]
[[1, 2, 3, 4, 5], [1, 2, 3, 5, 4], [1, 3, 2, 4, 5], [1, 3, 2, 5, 4]]

对于product(*perms),请参阅Unpacking Argument Lists - Python tutorial