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)
4 Réponses :
Puisque vous utilisez donc au lieu d'utiliser la carte code> ou si vous voulez toujours poursuivre sur mappe code> dans votre fonction, il renvoie une liste même lorsque vous appelez appelez la fonction de manière récursive.
ou
ou
ou
ou
Réduire code> qui ne sont pas des moyens pythoniques d'aplatir une liste imbriquée que vous pouvez utiliser une fonction de générateur: p>
plan Code> Fonction Vous pouvez utiliser l'approche suivante: p>
Mais l'exercice i> était d'utiliser mapper () code> et
réduire () code>. Yup, en utilisant un générateur rend cela assez facile, mais ce n'est pas ce que l'OP apprend i>.
@ 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 code>.
@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 a>
Vous ne pouvez pas résoudre ce problème avec avec ceci commence par une liste vide et appendez em> éléments à cela pour chaque Élément dans Ceci produit la sortie attendue: p> mapper () code> em>. 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 em>.
mappe () code> doit toujours produire le même nombre d'éléments dans la sortie que celui indiqué dans l'entrée, après tout.
Réduire () code> vous pouvez < em> appendez em> plus d'éléments à une liste existante: p>
listes code>. Si cet élément est une liste elle-même, la récursion est utilisée. P>
-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 () Code> Produit toujours le même nombre de sorties que vous y consacrez.
Solution alternative avec juste récursives:
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.
Voici une solution qui utilise à la fois 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 code> Réduire code> qui produit une seule sortie pour toutes les entrées. mappe code> et
réduisant code>:
mappe code> peut être utilisé ici pour créer tout l'entrée cohérente: c'est-à-dire une séquence de listes. P> p>
J'aimerais pouvoir uppoter cela un million de fois. Belle solution.
Indice: vous n'utilisez pas
réduire () code>.
@ S007, pouvez-vous partager où vous obtenez ces exercices de programmation fonctionnelle?