Código de uma linha usando mapa, lambda e condição if

Nov 22 2020

Usando zip e compreensão de lista, crie uma nova lista, L3, que some os dois números se o número de L1 for maior que 10 e o número de L2 for menor que 5. Isso pode ser feito em uma linha de código.

Eu tentei os códigos abaixo. Alguém pode explicar por que python reclama?

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)

Respostas

BenB Nov 22 2020 at 03:05

Dê uma olhada aqui : A função lambda deve ter um valor de retorno e se sua instrução if não for verdadeira, não há nenhum. Portanto, você teria que adicionar uma instrução else, por exemplo:

L4 = map(lambda  x: x[0] + x[1]  if (x[0] > 10 and x[1] < 5) else 0, zip(L1,L2))

Resulta em

[0, 0, 0, 18, 0, 0, 57, 0, 103]

Sua primeira tentativa (L3) não funciona porque lambda não pode mais descompactar tuplas em python 3.x (veja: aqui )

Observe também que map () retorna um objeto e para imprimir seu conteúdo, você teria que chamar

print(list(map_object))
# in your case:
print(list(L4))
# or set()

Edite com base no comentário: se você realmente deseja uma linha única e como sua primeira frase diz "usando compreensão de zip e lista" e você deseja omitir 0s, isso pode funcionar e é mais fácil do que mapear e lambda:

L3 = [x[0]+x[1] for x in zip(L1,L2) if (x[0] > 10 and x[1] < 5)]

Edite 2 se você realmente insiste em usar map e lambda:

L4 = map(lambda  x: x[0] + x[1], filter(lambda x: (x[0] > 10 and x[1] < 5), zip(L1,L2)))
2 wjandrea Nov 22 2020 at 03:42

Este é um problema XY . Você está usando um mapa quando ele pede uma compreensão de lista. Basicamente, está pedindo um filtro, não um mapa.

>>> [x1+x2 for x1, x2 in zip(L1, L2) if x1>10 and x2<5]
[18, 57, 103]

Você poderia fazer isso em um estilo funcional, mas é tão feio. Não faça isso.

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]