2017-03-12 1 views
1

Pour une raison quelconque, je vais avoir du mal réel envelopper ma tête autour des algorithmes récursifs ...Comment combiner des listes (en chaîne) de manière récursive?

je me demandais si quelqu'un pouvait me aider à trouver une version récursive de ce qui suit:

J'ai une liste des listes de nombres et je veux obtenir toutes les listes possibles de permutations de tous les éléments.

Par exemple, étant donné [[1], [2,3], [4,5]], je veux que la sortie soit:

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

La façon dont je l'ai fait est assez laid:

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) 

Je ne l'aime pas .. J'ai l'impression que la récursivité pourrait être plus élégante. Des pensées?

Répondre

3

Code Vous pouvez être simplifié sans récursion:

>>> 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]] 

Pour product(*perms), voir Unpacking Argument Lists - Python tutorial.

3

Vous pouvez simplifier les choses. Il suffit de passer tous les itérateurs de permutation pour itertools.product et aplatir les listes de listes que vous sortez:

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)]