Código de una línea usando mapa, lambda y condición if
Usando zip y comprensión de lista, cree una nueva lista, L3, que sume los dos números si el número de L1 es mayor que 10 y el número de L2 es menor que 5. Esto se puede lograr en una línea de código.
Probé los siguientes códigos. ¿Alguien puede explicar por qué se queja Python?
L1 = [1, 5, 2, 16, 32, 3, 54, 8, 100]
L2 = [1, 3, 10, 2, 42, 2, 3, 4, 3]
L3 = map(lambda (x1,x2): x1 + x2 if(x1 > 10 and x2 < 5) , zip(L1,L2))
L4 = map(lambda x: x[0] + x[1] if(x[0] > 10 and x[1] < 5) , zip(L1,L2))
print(L3)
print(L4)
Respuestas
Eche un vistazo aquí : la función lambda debe tener un valor de retorno y si su declaración if no es verdadera, no hay ninguno. Por lo tanto, tendría que agregar una instrucción else, por ejemplo:
L4 = map(lambda x: x[0] + x[1] if (x[0] > 10 and x[1] < 5) else 0, zip(L1,L2))
Resultados en
[0, 0, 0, 18, 0, 0, 57, 0, 103]
Su primer intento (L3) no funciona porque lambda ya no puede descomprimir tuplas en python 3.x (ver: aquí )
Tenga en cuenta también que map () devuelve un objeto y para imprimir su contenido tendría que llamar
print(list(map_object))
# in your case:
print(list(L4))
# or set()
Edite según el comentario: si realmente desea una línea simple y como su primera oración dice "usando zip y comprensión de lista" y desea omitir 0, entonces esto podría funcionar y es más fácil que map y lambda:
L3 = [x[0]+x[1] for x in zip(L1,L2) if (x[0] > 10 and x[1] < 5)]
Edite 2 si realmente insiste en usar map y lambda:
L4 = map(lambda x: x[0] + x[1], filter(lambda x: (x[0] > 10 and x[1] < 5), zip(L1,L2)))
Este es un problema XY . Estás usando un mapa cuando solicita una lista de comprensión. Básicamente, se trata de pedir un filtro, no un mapa.
>>> [x1+x2 for x1, x2 in zip(L1, L2) if x1>10 and x2<5]
[18, 57, 103]
Podrías hacerlo con un estilo funcional, pero es tan feo. No hagas esto.
L3 = list(map(
lambda t: t[0]+t[1],
filter(
lambda t: t[0]>10 and t[1]<5,
zip(L1, L2)
)
))
print(L3) # -> [18, 57, 103]