Il suggerimento principale che ti posso dare per l'HW4 recupero è quello di "usare le struttre dati opportune". Per esempio, convertire una tabella da lista a dizionario ti potrebbe essere utilissimo!
Per esempio, consideriamo
def studenti_brillanti(dbsize):
Ti potrebbe servire un dizionario in cui la chiave è il stud_code e il valore sono il resto degli attributi dello studente (perché l'operazione di controllo degli attributi dello studente si fa spessissimo in quella funzione, è utile farla in O(1), piuttosto che cercare in una lista) con una dict comprehension.
In altri casi ti potrebbe essere utile vedere i dati come liste. Dipende tutto dall'operazione che devi fare, e in base a quella decidi di cambiare la struttura dei tuoi dati nel modo opportuno (questo HW oltretutto è l'occasione perfetta per usare list comprehension)
Ti consiglierei anche di vedere qual'è il test che ti richiede più tempo e lavorare su quello . E, mi raccomando, se il codice diventa troppo grosso o intricato, prova a semplificarlo prima di procedere (conoscere SQL aiuta molto in questo HW).
Nota su SQL e il paradigma funzionale...
Visto che siamo in tema database, c'è da far notare come SQL si rapporti ai linguaggi di programmazione moderni, partendo da un esempio (totalmente scollegato dall'HW):
SELECT fornitore, importo_fattura
FROM fatture
WHERE importo_fattura > 10.000
Quello che è interessante è il fatto che si può mappare questo codice SQL in un qualunque linguaggio moderno... prendiamo l'esempio di JavaScript... il codice si potrebbe tradurre in questo modo:
fatture
. filter((fattura) => fattura.importo_fattura > 10.0)
.map((fattura) => [fattura.fornitore, fattura.importo_fattura])
Questa caratteristica dei linguaggi moderni di implementare funzioni tipiche del paradigma funzionale (filter, map, sum, iter, collect, reduce etc..) è quella che permette di manipolare dati in maniera facile e veloce. Python ha anche altri strumenti in più rispetto a JavaScript, per dire: le list comprehension per iterare, le dict comprehension per raggruppare, gli "if" dentro alla list comprehension per filtrare, etc... sono tutti strumenti potentissimi per la manipolazione di dati che si rifanno in parte anche ad SQL.
L'esempio più interessante è quello del parametro "key=" per funzioni come sort, min, max etc... perché si ispira direttamente ad SQL (come spiega il creatore di "key=" https://www.youtube.com/watch?v=OSGv2VnC0go al minuto 10:00). Di fatto, in SQL l'operazione di "ordinamento" con ORDER BY (specificando gli "attributi" su cui ordinare) è comunissima. Infatti, in Python si è deciso proprio di usare questa strategia per il "sorting": al parametro "key=" si specifica una funzione che genera una tupla con gli attributi, oppure il valore di uno specifico attributo, che poi Python userà per paragonare gli elementi della lista fra di loro. Questa caratteristica è interessante perché distingue Python da linguaggi come C++, in cui per l'ordinamento viene specificata una funzione che ritorna -1, 0 o 1 paragonando due elementi della lista.
Prima ho nominato JavaScript, e non a caso: nei tempi più recenti si tende a passare da DB (database) relazionali (che usano SQL, e hanno una struttura rigida) a DB NoSQL che sostanzialmente memorizzano file JSON (proprio come nel caso dell'HW4 recupero)... quindi quello che si fa quando si lavora su un sito è caricare i file JSON per interi, e si filtrano e manipolano i dati nel codice in base a quello che l'utente clicca sul sito (senza chiederli al DB già filtrati). Il vantaggio è che i dati vengono caricati una volta (con il metodo vecchio che si usa ancora con PHP, ogni volta che si cliccava qualcosa sulla pagina web, era necessario caricare i dati specifici che bisognava visualizzare). Chiaramente, esistono soluzioni ibride in base alla necessità (e a quanto si vuole spendere per il server nel back-end).