Pregunta

Tengo el siguiente código que utilizo para mapear una lista anidada en Python para producir una lista con la misma estructura.

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

Se puede hacer esto con la lista de comprensión solo (sin utilizar la función de mapa)?

¿Fue útil?

Solución

Para las listas anidadas puede utilizar listas por comprensión anidados:

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

Personalmente encuentro map a ser más limpio en esta situación, a pesar de que casi siempre prefiero listas por comprensión. Así que es realmente su llamada, ya sea va a funcionar.

Otros consejos

Recuerde que el Zen de Python:

  

En general, hay más de una - y probablemente varios - maneras obvias para hacerlo **

.

** Nota:. Editado por la exactitud

De todos modos, prefiero mapa.

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

Mapa es sin duda una forma mucho más limpia de hacer lo que quiere. Puede anidar las listas por comprensión sin embargo, tal vez eso es lo que está buscando?

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

Aquí es solución para lista anidada que tiene profundidad arbitraria :

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

desea mayúsculas todo lo que elementos de la lista, sólo tiene que escribir

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

Y más importante, esta función recursiva puede hacer más que esto!

Soy nuevo en el pitón, siéntase libre de hablar!

Otros críticos han dado la respuesta, pero siempre que estoy teniendo problemas para envolver mi cabeza alrededor de una construcción funcional, que tragarme mi orgullo y lo dicen claramente escritura a mano con los métodos y / u objetos de forma explícita no óptimas. Usted dijo que quería terminar con un generador, así:

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)

A veces es más limpio para mantener una de las versiones longhand. Para mí, mapas y reducen veces que sea más obvio, pero modismos Python podrían ser más evidentes para los demás.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top