由于某些原因,我在绕递归算法时遇到了麻烦......
我想知道是否有人可以帮我提出以下的递归版本:
我有一个数字列表列表,我希望得到所有元素排列的所有可能列表。
例如,给定[[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)
我不喜欢它...我觉得递归可能更优雅。 有什么想法吗?
答案 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。