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.

Valori della lista che cambiano quando "compilo" (sic)

Jury Francia (7520 points)
25 76 100
in Es1 by (7.5k points)
edited by
Oggi è la giornata dei problemi.. ho quasi terminato il programma se non fosse per il fatto che quando un insieme passato in input contiene più parole, come ad esempio il secondo test che contiene {' non', 'Si' }, il return che è una lista convertita con set in un insieme, ogni volta che compilo cambia valore. A volte mi stampa tutti i numeri dei post che contengono la parola 'non' altre volte quelli che contengono la parola 'si', invece come risultato dovrei avere questi numeri stampati insieme.
Io ciclo l'insieme e all'interno ciclo anche una lista opportunamente creata con i post.
Ho provato anche a convertire con list() l'insieme ed a ciclare quello, ma niente stesso problema
964 views
closed

5 Answers

Best answer
LeonardoEmili (35740 points)
14 65 155
by (35.7k points)
selected by

Ciao!

Il "trucco" in questo caso sta nell'iterare sull'insieme! Per farlo puoi utilizzare i classici metodi col for: oppure col while(): . Tuttavia se già ti trovi in questo caso, come presumo dal tuo commento riguardo agli elementi visualizzabili da print, allora si tratta di un problema diverso.

Purtroppo disponiamo di poche info a riguardo, pertanto ti chiedo gentilmente di fornire più dettagli magari postando qualche output per identificare meglio il tuo problema. Tuttavia proverò con qualche ipotesi sperando che tu possa capire dov'è il problema:

  • se iteri correttamente sugli elementi di un insieme e non si verifica il comportamento per TUTTI gli elementi allora vuol dire che in qualche modo il ciclo "fugge" dalle sue normali operazioni. Ti invito pertanto a controllare l'eventuale presenza di break/continue/return
  • potresti altresì trovarti nel caso in cui esegui determinate operazioni sugli elementi a condizione di, pertanto quando tale condizione si avvera le istruzioni vengono eseguite, altrimenti no. Perciò potresti provare a controllare se tali comportamenti sono presenti nel tuo programma.
Spero sinceramente che tu possa risolvere il tuo problema, se i consigli che ti ho appena suggerito non ti hanno ancora chiarito il problema allora non esitare a rispondere aggiungendo altre info.
.
Buona serata
Leonardo Emili
p.s. quel "Avvolte" mi ha rallegrato la serata :D
Jury Francia (7520 points)
25 76 100
by (7.5k points)
grazie per le info controllerò al più presto. Hahaha l ''avvolte' me lo ero perso, sono stato tutta al giornata a studiare e programmare sono fuso hahahaah
LeonardoEmili (35740 points)
14 65 155
by (35.7k points)
Di nulla! Ahahah capita a tutti! :D
Jury Francia (7520 points)
25 76 100
by (7.5k points)
Ho provato a fare una cosa, intanto ho messo fuori il for che scorre l'insieme e dentro, invece della for che scorre la lista ho usato una while, comunque il funzionamento è lo stesso.
Il fatto è che mettendo dentro un contatore e sommando 1 ogni volta che trova il valore dell'insieme all'interno della lista, ho notato che da lo stesso problema, cioè una volta è 8 (infatti quando stampa le chiavi sono 8 e mi manca l'ultima) e una volta è 1.
Quindi mi da lo stesso identico errore, la cosa che non capisco è una, il contatore (come la lista dove metto le chiavi) sono fuori dal ciclo, all'inizio valgono zero e ottengono valori tramite il ciclo, il count lo incremento con +=1 mentre per la lista uso il metodo .append ().
Quando il ciclo finisce dovrei avere tutti i valori, soprattutto il count, che ho usato anche in qualche esercizio del vecchio homework mantiene tutti i valori e bisogna azzerarlo al termine del ciclo se lo si vuole vuoto di nuovo.. come è possibile che qui invece mi cancella tutti i valori come se li sovrascrivesse?
Jury Francia (7520 points)
25 76 100
by (7.5k points)
ok ho risolto finalmente!
Mi ero scordato di azzerare l'indice.. e quindi non entrava nella while e mi prendeva o solo la parola 'non' o solo la 'si'.
grazie a tutti comunque per i consigli
LeonardoEmili (35740 points)
14 65 155
by (35.7k points)
Perfetto! Felice che tu abbia risolto!!
g
g.nosci (770 points)
5 11 17
by (770 points)
credo che della lista o set in questione tu stai prendendo un solo elemento ad esempio: controlli per 'non' e non controlli per 'Si', presumo tu stia prendendo sempre il primo elemento che nel caso dell'insieme può variare
Jury Francia (7520 points)
25 76 100
by (7.5k points)
nono ho provato a mettere un print nel ciclo e controlla sia per 'non' che per 'si' tutti gli indici dell'altra lista. Si avvolte dato che l'insieme non ha ordine si invertono e controlla prima una o l'altra ma comunque le controlla entrambe.
m
matteo.chiari (3650 points)
2 17 30
by (3.7k points)

Ciao,

sia i set (insiemi) che le liste sono elementi iterabili, l'unica differenza tra i due è che gli insiemi sono una collezione disordinata di elementi unici.

Da quello che sono riuscito a capire sembra che l'errore sia nella logica del tuo programma rispetto ad altro. 

Ti consiglio quindi di assicurarti che stai iterando fino alla fine l'insieme delle parole da ricercare (quello che nel secondo test è {'non', 'Si'}. 
Motivo: dato che gli insiemi sono disordinati, ogni volta che esegui il programma l'insieme delle parole da cercare potrebbe essere differente dalla volta precedente (magari è {'Si', 'non'} piuttosto che {'non', 'Si'}). Questo, combinato al fatto che forse non stai "girando" tutto l'insieme, potrebbe essere la causa del "vedo una volta quelli che contengono 'si' e una volta quelli che contengono 'non'.

Tieni a mente inoltre che restituisci sempre un set, e quindi, essendo sempre disordinato, ti può mostrare risultati in maniera diversa ogni volta.

Jury Francia (7520 points)
25 76 100
by (7.5k points)
Come ho scritto sopra, con la print vedo che li cicla tutti. E con il return ho provato anche a stampare solo la lista senza fare un insieme, stesso problema. Anche facendo restituire una lista quando compilo questa cambia di volta in volta random.
Denis (2230 points)
4 13 23
by (2.2k points)
Mi sembra sinceramente inverosimile che il tuo programma, senza esser modificato e con gli stessi input restituisca output diversi (non hai modificato il txt vero?).

Ti hanno già dato preziosi consigli, ne aggiungo un paio:

Controllo di inserire nell insieme risultato se trovi O un input O un altro (or non esclusivo si intende)

Controlla ,tramite il txt, che l id del post che estrai sia corretto
Jury Francia (7520 points)
25 76 100
by (7.5k points)
non ho modificato il file txt, gli altri 2 test li passa. Il terzo non lo passa perché manca un numero nell'insieme che faccio ritornare alla funzione, per la precisione il post 4 che se non sbaglio è l'unico che contiene la parola 'si'. Quando compilo avvolte mi ritorna l'insieme con tutte le chiavi corrette tranne questa e quindi il test non passa, ed altre volte mi ritorna l'insieme con solo quella chiave 4, senza le altre.
Denis (2230 points)
4 13 23
by (2.2k points)
È inspiegabile... hai controllato di considerare se trovi anche solo uno dei due elementi dell'insieme?
Prova a isolare questo post 4 e vedi come si comporta.
andrea.sterbini (207940 points)
756 1270 2377
by (208k points)

crying "compilo" ?

(ma python non era interpretato?)

Jury Francia (7520 points)
25 76 100
by (7.5k points)
Hahaha si professore ha ragione mi sono sbagliato a scrivere, purtroppo la stanchezza fa brutti scherzi @.@