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

Do you need help?

Notice Board

Problema righe successive Es2 Homework2

L
LoreLeva (320 points)
1 6 12
in Es2 by (320 points)
closed by
Sono giorni che sto cascando in questo errore, praticamente quando vado a leggere riga per riga (senza usare comandi del tipo readlines o read), per trovare se sotto un comp c'è un sub uso il comando next(), solamente che nel caso del primo file.txt, dove ci sono comp 4 e comp 3 uno sotto l'altro, usando  il next()  per comp4, mi salta il comp 3 e segna solo la chiave comp 4 con il valore vuoto, saltando completamente il comp3 ed un eventuale sub sotto. Ho provato a mettere un altro next() al comp 3, ma facendo questo mi sbalza le righe di 3 posizioni.

Grazie a chi risponderà.
404 views
closed with the note: Risolto

1 Answer

francesco.dev (33560 points)
22 51 129
by (33.6k points)

Ciao!
Non capisco perché tu non voglia usare i metodi readlines o read, perché sono quelli più efficienti e più adatti a risolvere proprio la tua problematica, mi spiego:
Ti consiglio semplicemente di considerare tutto il file come un insieme di stringhe, ora queste stringhe vanno messe in una lista.
Passaggi:

  • Lettura dell'intero file attraverso il metodo .read() (IN QUESTO CASO ti consiglio il metodo .readlines(), il quale ti crea una lista in cui ogni elemento è diviso dall'altro quando trova il ritorno a capo (ovvero il simbolo '\n');
  • Adesso avrai una lista contenete ogni riga del file. Ora per capire se un file ha un sub o meno ti basterà fare un piccolo controllo se la lista in posizione di i+1 è un sub o meno. Ti consiglio vivamente di usare l'operatore in, quindi scriverai if 'sub' in lista[i+1]. Così capirai se l'elemento successivo a quello che stai considerando è un sub o meno. Infine ricorda di inserire un controllo per non sforare il range! Ti basterà aggiungere un if legato alla len della lista.

Sperando di averti aiutato e di aver risolto questo piccolo problema,
Per altro non esitare a chiedere!
- Francesco Pio Scognamiglio

L
LoreLeva (320 points)
1 6 12
by (320 points)
Grazie per la risposta, avevo già provato come hai detto tu, solo che con i file di grandi dimensioni, con readlines(), ci mette troppo tempo. Per questo ho adottato il metodo con next().
francesco.dev (33560 points)
22 51 129
by (33.6k points)
Però con next hai proprio il problema che "salti" le righe. Per ovviare a tale problema potresti mettere next() in una variabile e controllare se è uguale a comp o uguale a sub, usando le rispettiva sintassi:  if 'comp' in lista[i] e elif 'sub' in lista[i]
francesco.dev (33560 points)
22 51 129
by (33.6k points)
Cosicché non perderai alcuna riga, in quanto se leggi comp farai una determinata cosa, se leggi sub ne farai un'altra!
L
LoreLeva (320 points)
1 6 12
by (320 points)
Come non detto, ho risolto sempre con next(). Grazie lo stesso per la risposta!