Asignación de una lista anidada con la comprensión de lista en Python?
-
19-09-2019 - |
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)?
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.