[Python] Ricerca in un dizionario.
Giorgio Zoppi
giorgio.zoppi a gmail.com
Lun 29 Maggio 2023 01:45:11 CEST
Ciao,
ti ringrazio per la domanda. E' un semplice esercizio sui dizionari, faccio
la assunzione le chiavi siano tutte lowecase, in caso non lo siano basta
una passata iniziale con tolower per renderle lowercase. Le precondizioni
sono:
1. cerchiamo la chiave di ingresso nelle chiavi
2. cerchiamo la chiave di ingresso nei valori.
In altri linguaggi si potrebbe pensare a una bimap, una mappa bidirezionale
che permette dai valori alle chiavi. Per mia ignoranza non so se esita una
cosa simile in Python però...possiamo come risultato finale restituire un
dizionario con 1 + 2.
# supponiamo cerco nonno
key = 'nonno'
source = {'nonno':[2,3,4,5], 'mamma':['figlia','nonno']}
saved = {}
# O(1)
if keyin source:
saved = { key : source[key] }
# ora ci tocca vede tutto ma lo facciamo con le dictionary comprensions,
# O(n)
dest = { k:v for k, v in source.items() if key in v }
# ora uniamo il saved to the dest, se ci sono duplicati
# li tratteremo per ora assumiamo che non ci siano duplicati.
if saved:
dest[key] = saved[key]
print(dest)
Questo e' happy path ci sono i duplicati da trattare e diversi casi. Lascio
a te la dimostrazione perche lo schermo di questo laptop e' troppo piccolo
per contenere i corner case.
Saluti,
Giorgio
Il giorno dom 28 mag 2023 alle ore 19:42 Gabriele Battaglia <
iz4apu a libero.it> ha scritto:
> Ciao e grazie in anticipo per il vostro tempo.
>
> Vi sottopongo una semplice situazione.
>
> Io so come risolverla, ma vi chiedo se c'è un modo più elegante del mio,
> che mi pare bruttino.
>
>
> Non vi propongo del codice, rimaniamo a livello di descrizione, poi se
> non ci riesco, magari arrivamo anche a degli esempi di codice.
>
>
> Ho un dizionario. Ci sono tutte le chiavi naturalmente, e i valori sono
> lunghe liste che contengono diversi tipi di dati, soprattutto stringhe e
> booleani.
>
>
> Ho una chiave di ricerca, una stringa. Devo passarla ad una funzione e
> questa mi deve tornare la prima chiave del dizionario se, la parola che
> cerco è compresa nella chiave stessa o in uno degli elementi contenuti
> nella lista di valori di quella chiave.
>
>
> Esempio, se cerco "nonno", la funzione mi deve tornare sia
>
>
> {'Nonno':[2,3,4,5.....]}
>
> che anche
>
> {'mamma':['figlia','nonno',......]}
>
>
> Io faccio
>
> for k,v in dizionario
>
> se chiave in k allora trovato uguale vero
>
> altrimenti trovato uguale falso
>
> poi... se v è una lista allora
>
> for indice in lista
>
> se indice è testo allora
>
> se chiave in indice trovato uguale vero
>
> altrimenti trovato uguale falso
>
>
> e indentato dentro al primo for
>
> se trovato è vero, ritorna indice
>
>
> Più o meno funziona ma, appunto, come vi dicevo, chissà se esiste un
> modo più elegante e soprattutto conciso.
>
>
> Se non vi ruba tempo, voi come fareste?
>
>
> Non suggeritemi oggetti che non siano quelli citati, intendo, no
> librerie esterne per la gestione di query e DB, devo lavorare con tipi
> di dati base.
>
>
> Grazie mille in anticipo.
>
>
> Gabry.
>
> --
> Gabriele Battaglia (IZ4APU)
> --... ...-- -.. . .. --.. ....- .- .--. ..- - ..- . .
> Sent from my Giant Desktop PC
>
> _______________________________________________
> Python mailing list
> Python a lists.python.it
> https://lists.python.it/mailman/listinfo/python
>
--
Life is a chess game - Anonymous.
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.python.it/pipermail/python/attachments/20230529/a9ad5617/attachment.html>
Maggiori informazioni sulla lista
Python