Question

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

Peut-on faire avec la compréhension de la seule liste (sans utiliser la fonction de la carte)?

Était-ce utile?

La solution

Pour les listes imbriquées, vous pouvez utiliser compréhensions liste imbriqués:

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

Personnellement, je trouve map être plus propre dans cette situation, même si je préfère presque toujours compréhensions de la liste. Il est donc vraiment votre appel, car soit fonctionnera.

Autres conseils

Rappelez-vous le Zen de Python:

  

Il est en général plus d'un - et probablement plusieurs - façons évidentes de le faire **

.

** Note:. Edité pour la précision

De toute façon, je préfère carte.

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

La carte est certainement une façon beaucoup plus propre de faire ce que vous voulez. Vous pouvez imbriquer la liste compréhensions cependant, peut-être c'est ce que vous êtes après?

[[ix.upper() for ix in x] for x in nested_list]

est la solution ici pour la liste imbriquée qui a une profondeur arbitraire :

def map_nlist(nlist=nlist,fun=lambda x: x*2):
    new_list=[]
    for i in range(len(nlist)):
        if isinstance(nlist[i],list):
            new_list += [map_nlist(nlist[i],fun)]
        else:
            new_list += [fun(nlist[i])]
    return new_list

vous voulez majuscules tout ce que vous élément de la liste, tapez simplement

In [26]: nested_list = [['Hello', 'World'], ['Goodbye', [['World']]]]
In [27]: map_nlist(nested_list,fun=str.upper)
Out[27]: [['HELLO', 'WORLD'], ['GOODBYE', [['WORLD']]]]

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

Je suis nouveau à python, ne hésitez pas à discuter!

D'autres affiches ont donné la réponse, mais chaque fois que je vais avoir du mal à envelopper ma tête autour d'une construction fonctionnelle, je ravaler ma fierté et épeler longhand avec des méthodes explicitement non-optimales et / ou des objets. Vous avez dit que vous vouliez finir 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)

Parfois, il est plus propre à garder l'une des versions de longhand. Pour moi, carte et réduire parfois faire plus évident, mais idiomes Python pourrait être plus évident pour les autres.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top