11
votes

Cartographie d'une liste imbriquée avec la compréhension de la liste à Python?

J'ai le code suivant que j'utilise pour mapper une liste imbriquée en Python pour produire une liste avec la même structure.

>>> nested_list = [['Hello', 'World'], ['Goodbye', 'World']]
>>> [map(str.upper, x) for x in nested_list]
[['HELLO', 'WORLD'], ['GOODBYE', 'WORLD']]


0 commentaires

5 Réponses :


15
votes

Pour les listes imbriquées, vous pouvez utiliser des compréhensions de liste imbriquée:

nested_list = [[s.upper() for s in xs] for xs in nested_list]


1 commentaires

Dans la carte PY3K, une liste doit être appliquée à celle-ci.



3
votes

carte est certainement un moyen beaucoup plus propre de faire ce que vous voulez. Vous pouvez nier les compréhensions de la liste cependant, c'est peut-être ce que vous êtes après? XXX


1 commentaires

Oui, il peut être plus propre à l'aide de la carte mais j'aimerais utiliser un générateur.



1
votes

D'autres affiches ont donné la réponse, mais chaque fois que je rencontre des difficultés enrouçant ma tête autour d'une construction fonctionnelle, j'avale ma fierté et l'épelez-la de la Longhande avec des méthodes et / ou des objets explicitement non optimaux. Vous avez dit que vous vouliez vous retrouver avec un générateur, donc:

for xs in n_l:
    def doUpper(l):
        for x in l:
            yield x.upper()
    yield doUpper(xs)

for xs in n_l:
    yield (x.upper() for x in xs)

((x.upper() for x in xs) for xs in n_l)


0 commentaires

5
votes

N'oubliez pas le zen de Python:

Il y a généralement plus d'un - et probablement plusieurs em> - manières évidentes de le faire. ** P> blockQuote>

** Remarque: édité pour la précision. P>

Quoi qu'il en soit, je préfère la carte. P>

from functools import partial
nested_list = map( partial(map, str.upper), nested_list )


2 commentaires

Wow. Apparemment, ma petite blague sur le zen de Python a vraiment blessé les sentiments de quelqu'un (et donc le bowvote). Alléger, les gens! (FWIW, je suis 100% sincère sur l'utilisation de carte dans ce cas.)


"Il devrait y avoir [...]", +1 pour dire la vérité x-)



2
votes

Voici une solution pour la liste imbriquée qui a une profondeur arbitraire : xxx

vous voulez en majuscule tout ce que vous listeriez l'élément, juste Tapez xxx

et plus important, cette fonction récursive peut faire plus que cela!

Je suis nouveau à Python, n'hésitez pas à discuter!


4 commentaires

Utilisez Ajoutez au lieu de + = , pour éviter de recréer une nouvelle liste pour chaque élément.


@Oannisfilippidis Filippidis Hey Merci de répondre, mais pouvez-vous me donner plus de détails sur le problème avec + =? Je ne comprends pas bien la différence ... (long time no user python ..)


Laissez a = liste () . Avec A.Append (0) La même liste est étendue avec un autre élément. En revanche, a + = [0] crée une nouvelle liste [0] qui est ensuite rejeté de la mémoire. Correction de mon commentaire précédent: Je pensais que __ iadd __ a fonctionné comme __ ajouter __ , mais en utilisant id a révélé que ce n'est pas le cas. Plus de détails peuvent être trouvés ici .


C'est vraiment intelligent!