Do you need any help?

Filter...lambda vagabondare nel lambda calcolo, iterare su una lista di tuple considerando solo uno specifico indice

SimoneBd96 (3030 points)
5 11 33
asked Nov 3, 2020 in Programmare in Python by SimoneBd96 (3,030 points)
recategorized Nov 3, 2020 by andrea.sterbini

Ho una domanda stavo cercando di sviluppare una lista attraverso la funzione filter, e utilizzando il costruto delle lambda, per creare una sequenza, ora la riga di codice in PSEUDOCODICE è la seguente "prendi una sequenza vuota e mettici dentro il risultato di una filter dove il primo argomento è una lambda x: chiave dizionario solo se uguale a 15, il secondo argomento è un iteratore lista composto da (chiave:valore) ora mi chiedo se io volessi iterare sempre e solo sul primo elemento della tupla, questo per ogni elemento della lista, come devo fare? avevo pensato l[_][0] ma non credo funzioni... grazie in anticipo

204 views

2 Answers

Best answer
1
1937764 (3520 points)
6 14 42
answered Nov 3, 2020 by 1937764 (3,520 points)
selected Nov 3, 2020 by SimoneBd96

Non ho ben capito cosa vuoi dire, in più è vietato scambiarsi codice ma credo che usarlo per spiegare sia lecito (spero).

Se abbiamo dizionario che è un dict, e tu come secondo argomento del filter passi dizionario.items(), nella lambda (che diciamo essere scritta come lambda x: ...codice...) il parametro x sarà una tupla dove x[0] è la chiave e x[1] è il valore.

Se vuoi filtrare per valore uguale a 15, basta fare lambda x: x[1] == 15. Perchè x è la tupla, e x[1] il valore della entry del dict dizionario iniziale.

Filter restituisce un iterabile di tuple. Se vuoi costruire un dict con il risultato, basta passare ciò che restituisce filter al costruttore dict(...)

EDIT

Puoi combinare quello che ho detto su filter() con una list comprehension che passa da tupla a singolo elemento

Semplificando, il problema è ora scomposto in 2 sottoproblemi:

{ 'a': 1, 'b': 2, 'c': 15, 'd: 15 }

=> items() =>

[ ('a', 1), ('b', 2), ('c', 15), ('d', 15) ]

=> filter(...lambda..., ......) =>

[ ('c', 15), ('d', 15) ]

=> list comprehension =>

[ 'c', 'd' ]

SimoneBd96 (3030 points)
5 11 33
commented Nov 3, 2020 by SimoneBd96 (3,030 points)
voglio costruire una sequenza che contiene, il primo elemento della tupla dizionario.itmes() se e solo se tupa[1]==15, si purtroppo non potendo scrivere codice non potevo essere esplicito
1
1937764 (3520 points)
6 14 42
commented Nov 3, 2020 by 1937764 (3,520 points)
Risposta aggiornata!
SimoneBd96 (3030 points)
5 11 33
commented Nov 3, 2020 by SimoneBd96 (3,030 points)
sei un genio!
s
stefano.fantauzzi (2260 points)
3 6 17
commented Nov 3, 2020 by stefano.fantauzzi (2,260 points)

Ti propongo una soluzione alternativa che usa i soli iteratori per evitare la list comprehension, può esserti utile forse per migliorare le performances ma non ne sono sicuro, andrebbe misurato laugh

Puoi fare una cosa del genere:  invocare il costruttore list sull'iterator map che con una lambda ti restituisce il primo elemento della tupla, le tuple sono nell'iterator filter del dizionario

Potrebbe risultare in una cosa del genere: list(map(...lambda..., filter(...lambda..., oggetti)))

Spero di essere stato d'aiuto e di non essere stato troppo esplicito col codice

Edit: ti risparmi un for esplicito e abbassi cc surprise

1
1937764 (3520 points)
6 14 42
commented Nov 3, 2020 by 1937764 (3,520 points)

Si, sul CC hai ragione. Sulle performance è praticamente uguale.

s
stefano.fantauzzi (2260 points)
3 6 17
commented Nov 3, 2020 by stefano.fantauzzi (2,260 points)
Corretto, ho misurato anche io e il map_list è sempre leggermente meno performante, probabilmente è dovuto al fatto che il costruttore list è infinitesimamente più pesante rispetto a creare la lista con [...]
SimoneBd96 (3030 points)
5 11 33
commented Nov 3, 2020 by SimoneBd96 (3,030 points)
diciamo che io ero interessato molto di più alle performance, ma ho potuto constatare che appunto la map non conviene nel mio caso, grazie ragazzi
R
Raffaele (3850 points)
10 24 48
answered Nov 3, 2020 by Raffaele (3,850 points)
Vorrei risponderti ma non è ben chiara la richiesta.

Per sequenza cosa intendi? Una lista o una stringa? Non so se ho capito bene, vuoi creare unal lista di tuple a partire da un dizionario? Tipo cosi [(key, key:value), (... )]?
SimoneBd96 (3030 points)
5 11 33
commented Nov 3, 2020 by SimoneBd96 (3,030 points)
la lista è creata attraverso .items() esatto, io però voglio scorrere solamente sulla key di ogni tupla, grazie in anticipo