Please ignore secret bonuses. Secret tests do NOT award bonus. Max hw grade is 30+2 bonus efficiency

Do you need help?

Notice Board

Per partecipare al corso di Fondamenti di programmazione 2023-24 loggatevi e attivatelo nella vostra pagina dei corsi preferiti. A quel punto il corso appare nel menù personale cliccando sul proprio avatar. Per i materiali degli anni precedenti seguite lo stesso metodo.

To join the Programming/Lab 2023-24 course, log-on and select it on the my courses page. It will appear on the personal menu of your avatar. For earlier years use the same method.

Dizionari chiavi mancanti

a.capobianco1 (16770 points)
11 54 165
in Es3 by (16.8k points)
Ho un dizionario con chiavi numeriche da 1 a n con alcune chiavi mancanti (es. 1,2,5 8 n)
Quando cerco una di queste chiavi inesistenti ovviamente mi viene restituito un errore.
La domanda è esiste un modo EFFICIENTE per farsi restituire la prima chiave immediatamente superiore numericamente a quella ricercata mancante? (Quindi se cerco 3 voglio il 5)

Ps:escludendo quello di trasformare le chiavi in lista alla quale aggiungo la chiave mancante, poi ordino la lista è ricavo index chiave mancante e mi faccio restituire quello con index successivo... Che non mi soddisfa.
639 views
closed

4 Answers

Best answer
Sickboy (28240 points)
7 25 68
by (28.2k points)
selected by
Se fai un ciclo che parte dalla chiave che vuoi cercare nel tuo esempio 3 e arriva fino all'ultima chiave (valore numerico) es 10 e dentro puoi usare un try except che se genera l'errore che non esiste la chiave va avanti col ciclo e invece se la trova esce con break
Xriuk (13590 points)
6 24 116
by (13.6k points)

Basterebbe controllare con:

if chiave in diz

Ed eviti eccezioni

a.capobianco1 (16770 points)
11 54 165
by (16.8k points)
@Sickboy mi sembra un ragionamento valido: lo testo e vedo se è più veloce (mi viene da pensare di si… poi do conferma).

@Xriuk temo sia lento dover controllare ogni volta : è quello che sto facendo all'interno dell'iterazione di cui parlava @Vincenzoimperati nella prima risposta...
Sickboy (28240 points)
7 25 68
by (28.2k points)
L hai provato?
a.capobianco1 (16770 points)
11 54 165
by (16.8k points)
Yes. mi ha fatto guadagnare un po di tempo rispetto alla semplice iterazione.. tuttavia voglio provare a essenzializzare il dizionario. Comunque in riferimento alla domanda è il suggerimento migliore

mentre per quanto attiene la rivisitazione dell'intero esercizio 3 (quindi con una prospettiva contestualizzata che va ben oltre ciò che chiedevo nella domanda) devo vedere se riesco a togliere 'i buchi' dal dizionario e se ce la faccio non avrà senso neanche gestire l'eccezione. (mi riferisco ai suggerimenti @vincenzo e @andrea
VincenzoImperati (6290 points)
6 15 58
by (6.3k points)
se non trovi una chiave e ti da errore puoi iterare di più uno il valore e ricercarlo dentro al dizionario fino a quando non lo trovi. Ma per il terzo esercizio se usi i dizionari come chiavi sono ottime le ascisse e non avrai problemi perchè ci saranno tutte da 2 fino alla x finale -1
_andrea_ (45670 points)
11 42 297
by (45.7k points)
Il fatto è che ai può evitare di averle tutte in teoria. Solo che poi quelle che mancano debi ricavarle in qualche modo
a.capobianco1 (16770 points)
11 54 165
by (16.8k points)
@Vincenzoimperati iterando da dal valore successivo in poi è quello che faccio ora ed è per questo che cercavo un metodo più veloce… per quanto riguarda il fatto di considerare le ascisse invece che le ordinate .. a logica mi viene da pensare che vi sono più iterazioni da fare o sbaglio? (non ho modo di appurare perché l'intero algoritmo è basato sulle y)

@_andrea_ non ho capito: posso evitare di averle tutte ma poi devo ricercarle? non sono due affermazioni in antitesi? i'm confused :-)
VincenzoImperati (6290 points)
6 15 58
by (6.3k points)
se lavori con le x non avrai questi problemi e sono le stesse iterazioni(più elementi ma nessuna lista)
_andrea_ (45670 points)
11 42 297
by (45.7k points)
Si se cerchi la forma essenziale del dizionario non servono tutti i punti, ma è più lento perché devi ricavarli. Per rispondere a vincenzo, lavorare con le x o con le y è la stessa cosa. Dici che le x le avrai tutte dalla 2 al max-1, ma anche per le y è lo stesso. L'ho fatto in entrambi i modi e cambia solo per comodità. Quello che ti dà un vantaggio è quali salvi nel dizionario e come le salvi. Per il resto, x o y sono uguali
_andrea_ (45670 points)
11 42 297
by (45.7k points)
Non penso ci sia un modo più veloce. Io lo ho provati entrambi e alla fine ho capito che biaogna evitare i buchi nelle chiavi
a.capobianco1 (16770 points)
11 54 165
by (16.8k points)
è quello che sto tentando di fare :-)
_andrea_ (45670 points)
11 42 297
by (45.7k points)
Devi farlo mentre crei il dizionario la prima volta
a.capobianco1 (16770 points)
11 54 165
by (16.8k points)

E' quello che temevo 

è ' sempre dura rimettere mano al codice.

p
pietrobrega (4460 points)
4 13 42
by (4.5k points)
Uno dei metodi più veloci è gestire l'eccezione con try e catch. Quindi ad esempio:
try:
    print(diz[n])
catch:
    continue
a.capobianco1 (16770 points)
11 54 165
by (16.8k points)

try:

except:

vorrai dire devil

p
pietrobrega (4460 points)
4 13 42
by (4.5k points)
Si esatto era una rimanenza di java...ahahahah
d
davide.scrimieri (2930 points)
4 16 39
by (2.9k points)
java è fonte di ogni bene , non una rimanenza! :D (e anche il 90% del mercato del lavoro nello sviluppo sw nel mercato italiano)