6
votes

Utilisation de la récursivité avec la carte en Python

J'essaie d'apprendre des concepts de programmation fonctionnelle. Un exercice, aplatit une liste imbriquée à l'aide de la carte / à la réduction. Mon code.

lists = [ 1 , 2 , [ 3 , 4, 5], 6, [7, 8, 9] ]
def flatten(lists):
      return map(lambda x: flatten(x) if isinstance(x,list) else x, lists)

print flatten(lists)


2 commentaires

Indice: vous n'utilisez pas réduire () .


@ S007, pouvez-vous partager où vous obtenez ces exercices de programmation fonctionnelle?


4 Réponses :


1
votes

Puisque vous utilisez mappe dans votre fonction, il renvoie une liste même lorsque vous appelez appelez la fonction de manière récursive.

donc au lieu d'utiliser la carte ou ou ou ou ou Réduire qui ne sont pas des moyens pythoniques d'aplatir une liste imbriquée que vous pouvez utiliser une fonction de générateur: xxx

si vous voulez toujours poursuivre sur plan Fonction Vous pouvez utiliser l'approche suivante: xxx


5 commentaires

Mais l'exercice était d'utiliser mapper () et réduire () . Yup, en utilisant un générateur rend cela assez facile, mais ce n'est pas ce que l'OP apprend .


@ Martijnpieters Vous avez raison d'apprendre. Buti vient de dire que ce n'est pas pythonique et démontrer la bonne voie. Nécessité de la manière dont j'ai mis à jour la réponse avec une approche basée sur la carte .


@Kasramvd ne réussit pas au total = [] comme paramètre contre le principe de programmation de fonction? Comme cela le rend mutable.


@ S007 Les objets de liste sont mutables en Python.


Oui, mais c'est au mieux un commentaire, avec un lien avec le poste canonique sur le sujet: aplatissé (une liste irrégulière) des listes de Python



5
votes

Vous ne pouvez pas résoudre ce problème avec mapper () . Les appels récursifs renvoient une liste, donc pour une liste dans l'entrée que vous avez remplacée le résultat avec une autre liste . mappe () doit toujours produire le même nombre d'éléments dans la sortie que celui indiqué dans l'entrée, après tout.

avec Réduire () vous pouvez < em> appendez plus d'éléments à une liste existante: xxx

ceci commence par une liste vide et appendez éléments à cela pour chaque Élément dans listes . Si cet élément est une liste elle-même, la récursion est utilisée.

Ceci produit la sortie attendue: xxx


2 commentaires

-Merci. Cela signifie qu'il ne peut pas être résolu avec la carte et réduire plutôt simplement. Juste une pensée.


@ S007: ça ne peut pas. Carte () Produit toujours le même nombre de sorties que vous y consacrez.



0
votes

Solution alternative avec juste récursives: xxx


1 commentaires

Eh bien, j'aurais affiché une réponse réduite qui vient directement à l'esprit lors de l'aplatir une liste. C'était parce que réduire a déjà été posté comme une réponse.



8
votes

Voici une solution qui utilise à la fois mappe et réduisant : xxx

Comme Martijn dit, la carte produit le même nombre d'articles Comme il reçoit sur son entrée, l'étape extérieure doit donc être l'appel Réduire qui produit une seule sortie pour toutes les entrées. mappe peut être utilisé ici pour créer tout l'entrée cohérente: c'est-à-dire une séquence de listes.


1 commentaires

J'aimerais pouvoir uppoter cela un million de fois. Belle solution.