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.

dizionario hw2.2

G
Giacomozm (1440 points)
19 59 68
in Es2 by (1.4k points)
E' consigliabile usare un ciclo while che finchè ad un attributo non è assegnato la lista vuota deve aggiungere elementi?

se si, come faccio a impostare che deve controllare tutti gli attributi fino a che non sono della forma x:[]
670 views
closed

3 Answers

Best answer
francesco.dev (33560 points)
21 51 129
by (33.6k points)
selected by
Ciao!

Da come dici, puoi benissimo fare un ciclo While finché x[i] != []
Però puoi fare così a patto che tu metta una seconda condizione in cui controlli che i non supera la lunghezza, perché altrimenti vai fuori dal range.

Infine, consiglio:
Qual è il problema che vuoi risolvere? Perché un While così strutturato non è molto efficiente. Secondo me c'è un'altra soluzione molto più semplice che potresti e dovresti prendere in considerazione.

EDIT -> Soluzione che fa al caso tuo:
Fai un for normale che scorre tutte le posizioni.
Per ogni posizione controlli se ci sono dei subcompiti collegati (quindi fai un for annidato) ed inserisci un if nel for annidato che se il contenuto del dizionario[x] è uguale alla lista vuota, allora metti un break per uscire dal ciclo annidato.

Aspettando tue notizie,
- Francesco Pio Scognamiglio
G
Giacomozm (1440 points)
19 59 68
by (1.4k points)
Ti spiego, io ho un dizionario che ha come chiavi tutti gli elementi comp e come attributi i sub corrispondenti o in caso la stringa vuota. Quello che sto cercando di fare è che per ogni chiave vengano assegnati gli elementi da svolgere precedentemente.
esempio
{'1': '5',
 '10': '4',
 '2': '4',
 '3': '4',
 '4': [],
 '6': '7',
 '7': '4',
 '8': '4',
 '9': '7'}
per il 6 ad esempio guardo l attributo che è il 7 e controllo il suo attributo all interno del dizionario che in questo caso è 4 e poi controllo l attributo del 4 tra le chiavi del dizionario,vedo che è una lista vuota e mi fermo. La mia domanda è come faccio a impostare questo ciclo di controlli che si deve bloccare quando trova una lista vuota?
francesco.dev (33560 points)
21 51 129
by (33.6k points)
Semplicemente fai un for normale che scorre tutte le posizioni. Per ogni posizione controlli questa cosa dei subcompiti (quindi for annidato) e metti un if che se il contenuto del dizionario nella chiave x è uguale alla lista vuota, allora metti un break per uscire dal ciclo annidato.
G
GiuseppeLaRocca (1170 points)
4 15 28
by (1.2k points)
Ciao, io avevo fatto in questo modo, ma, arrivando all'esecuzione del test 6 il programma va in timeout. Consigli?
francesco.dev (33560 points)
21 51 129
by (33.6k points)
Prova ad ottimizzare tutto il resto, perché anche io ho usato tale ragionamento e non sforo il limite di tempo. Prova a concentrarti sulle altre operazioni che fai!
G
GiuseppeLaRocca (1170 points)
4 15 28
by (1.2k points)
Un ultima cosa, io faccio che alla fine confronto il mio dizionario con l'insieme dato in input in modo da "pulirlo"; secondo te questo passaggio può esserne la causa e magari dovrei controllare man mano che controllo le dipendenze dei compiti?
francesco.dev (33560 points)
21 51 129
by (33.6k points)
In che senso confronti? E cosa intendi per controllare man mano le dipendenze dei compiti? Perché se usi questo secondo metodo alla fine non ci ricavi molto di efficienza, in quanto ugualmente dovresti andare a scorrere più e più volte l'intero dizionario.
Dammi qualche informazione in più e sarò felice di aiutarti
G
GiuseppeLaRocca (1170 points)
4 15 28
by (1.2k points)
Allora, inizialmente creo un dizionario che contiene il "comp" con il relativo "sub" se presente; poi itero sul dizionario e   inizio a costruire il dizionario che dovrò stampare sul file. Infine confronto il dizionario ottenuto con l'insieme 'insi', ovvero itero sulle chiavi del mio dizionario e contro se sono presenti o meno nell'insieme; se una chiave non è presente la cancello dal dizionario
francesco.dev (33560 points)
21 51 129
by (33.6k points)
Hai provato ad usare il comando 'in' senza stare a controllare se ogni posizione del dizionario è uguale ad una posizione di insi? Semplicemente dici se un elemento di insi in dizionario: allora...
Così sarebbe già un'ottima idea per migliorare il tuo software!
G
GiuseppeLaRocca (1170 points)
4 15 28
by (1.2k points)
Il problema è che ho fatto proprio così. Ho utilizzato 'not in' e se la condizione viene verificata allora allora elimina quella chiave
francesco.dev (33560 points)
21 51 129
by (33.6k points)
E allora prova a vedere altro, perché se hai usato anche l'in allora forse c'è altro da ottimizzare
V
Valerio.Pescatori (1940 points)
11 25 38
by (1.9k points)

Ciao

Sì, puoi utilizzare il while in quel modo, ovviamente devi stare attento a non incappare in qualche loop,

puoi fare un ciclo sull'intero dizionario, ad esempio 'for i in d' così in i avrai le chiavi del dizionario e per controllare il loro contenuto ti basta fare d[i].

altrimenti puoi usare il metodo d.values() che ti restituisce una lista con gli attributi del dizionario.

G
Giacomozm (1440 points)
19 59 68
by (1.4k points)
si ma a me serve che d[i] alla fine diventi []. come faccio a controllarli tutti
LeonardoEmili (35740 points)
13 65 155
by (35.7k points)

Ciao!

Potresti adottare una soluzione di questo tipo. Iteri su ogni elemento con un for e finchè il dizionario [ chiave ] ha un valore assegnatogli, nel tuo caso un sub, continui a iterare. Così facendo ti eviti l'utilizzo di ulteriori if o break. Infatti il ciclo verrà rieseguito finchè non incontra la lista vuota, che era proprio quello che volevi.

Perdona i giri di parole in pseudo codice, ma penso di esser stato fin troppo esplicito ! :D

Buona serata

Leonardo Emili