7 svar
546 visningar
FiaLisa30 3 – Fd. Medlem
Postad: 15 sep 2020 13:34

Göra en referenslista för ord på vilken rad

Har denna uppgift: "Gör en variant av programmet som läser en fil (typiskt ett datorprogram). Programmet ska producera en lista med radnummer över filen och en referenslista som för varje ord anger på vilka rader det förekommit. Python-ord som for, if, def... ska inte tas med i listan liksom inga ord från kommentarerna. "

 

Det jag har gjort är detta:

Där filen jag importera innehåller det jag vill numrera och sen få i referenslistan.

Har lyckats med att numrera varje rad i L7-filen.

Men det är när jag skall få orden i en referenslista som det helt skiter sig, det som är i ordraknaren är alltså det jag har problem med. Vet att det är helt fel det jag har gjort, men kan för mitt liv inte heller komma på hur jag skall göra det rätt.

emilg 478
Postad: 15 sep 2020 14:32

En rad kan bestå av flera ord eller? Jag tror du måste första dela upp raden i olika ord och sen spara för varje ord ha ett set över vilka rader det finns på. Glöm inte bortse från Python-ord (verkar som) och ord från kommentarerna.

Får du något  fel? Eller vad exakt är problemet just nu?

FiaLisa30 3 – Fd. Medlem
Postad: 15 sep 2020 14:38

Det som blir nu när jag kör programmet är att den endast visar antalet av varje ord som är på sista raden i min fil L7, alltså den räknar unika ord endast på sista raden.
Det jag har skrivit kollar inte på vilka rader orden finns, vilket är det jag vill printa i min referenslista

Laguna 28468
Postad: 15 sep 2020 14:50

Varför kommer det kod efter 'return' i funktionen?

Är den här filen L7.py, eller är det en annan?

Lindehaven 820 – Lärare
Postad: 15 sep 2020 14:54 Redigerad: 15 sep 2020 15:33

Problemet är att du anropar funktionen ordraknare med line som argument men funktionen behöver infil som argument.

Det finns mer att fundera på och koda innan programmet uppfyller kraven i uppgiften:

En rad kan bestå av flera ord så raden behöver delas upp i dessa ord. t ex med re.findall(r"[\w']+", line).

Ett ord som förekommer som kommentar, d v s efter tecknet '#', ska inte tas med. t ex med find() och slicing.

Ett ord som hör till språket Python ska inte tas med. Ett tips är att nyttja modulen keywords som har en funktion iskeyword().

Ett ord kan förekomma på flera rader så varje ord i referenslistan behöver en mängd med ett eller flera radnummer. Använd t ex klassen set och metoden add().

FiaLisa30 3 – Fd. Medlem
Postad: 15 sep 2020 19:44

Då jag är väldigt ny inom programmering så är jag inte helt med på vad du menar.

Hur används iskeyword() och vars skall den skrivas?

Vet ej hur set fungerar, vad gör jag med det?

 

Så här ser det ut nu för mig:

 

Så har fått bort typ kommentarer. Samt fått att orden i referens att sorteras utan parenteser och ordning men högst antal ord överst.

Dock så printas både den sorterade listan samt orden igen fast med parenteser (beskriver nog väldigt dåligt nu). Vilket beror på att printar den två gånger, men får dock inte till det att det endast printas "fint" utan parenteser

Lindehaven 820 – Lärare
Postad: 15 sep 2020 20:08

Det kan bero på att du blandar ihop de globala variablerna line och lines med attributet line och den lokala variabeln line. När du anropar funktionen ordraknare( ) så gör du det med den globala variabeln line som innehåller den sist inlästa raden från filen. När koden i funktionen ordraknare( ) sedan körs så används inte attributet line utan det skrivs över med den lokala variabeln line. Du bör inte heller använda globala variabler som exempelvis lines i dina funktioner.

Uppgiften är relativt svår och exempelkoden innehåller både reguljära uttryck och lambda-funktion vilket är förbi nybörjarstadiet. Därför antog jag att du redan behärskar grundläggande koncept som t ex slicing, moduler och mängder. Om du vill kolla om ett ord är ett reserverat ord i Python så kan du prova det med:

import keyword
word = 'print'
if keyword.iskeyword(word):
    print(word, 'är ett reserverat ord i Python')

Laguna 28468
Postad: 15 sep 2020 20:12

Det är rätt förvirrande att din funktion både returnerar något som ska skrivas ut, och skriver ut nånting själv. Det blir bättre om den bara gör en av de sakerna. 

Svara Avbryt
Close