Codice di una riga che utilizza map, lambda e if condition

Nov 22 2020

Utilizzando zip e comprensione dell'elenco, creare un nuovo elenco, L3, che somma i due numeri se il numero da L1 è maggiore di 10 e il numero da L2 è minore di 5. Questo può essere ottenuto in una riga di codice.

Ho provato i codici seguenti. Qualcuno può spiegare perché Python si lamenta?

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)

Risposte

BenB Nov 22 2020 at 03:05

Dai un'occhiata qui : la funzione lambda deve avere un valore di ritorno e se la tua istruzione if non è vera, non ce n'è. Pertanto, dovresti aggiungere un'istruzione else, ad esempio:

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

Risultati in

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

Il tuo primo tentativo (L3) non funziona perché lambda non può più decomprimere le tuple in python 3.x (vedi: qui )

Nota anche che map () restituisce un oggetto e per stampare il suo contenuto dovresti chiamare

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

Modifica in base al commento: se vuoi davvero una riga e come dice la tua prima frase "usando zip e comprensione dell'elenco" e vuoi tralasciare gli 0, allora questo potrebbe funzionare ed è più facile di map e lambda:

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

Modifica 2 se insisti davvero, davvero, davvero sull'uso di 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

Questo è un problema XY . Stai usando una mappa quando richiede una comprensione dell'elenco. Sta essenzialmente chiedendo un filtro, non una mappa.

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

Potresti farlo in uno stile funzionale, ma è così brutto. Non farlo.

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]