14 svar
377 visningar
anony123 är nöjd med hjälpen
anony123 163 – Fd. Medlem
Postad: 20 sep 2022 23:32 Redigerad: 20 sep 2022 23:39

Klass och metod

"Ni ska i denna uppgift läsa in några data om (europeiska) länder från en fil där denna informationen är nationens namn, dess folkmängd och yta. Strukturen ska lagras som en lista av objekt där varje objekt innehåller följande instansvariabler för (ni väljer namn själva):  nationens namn, folkmängden, ytan.

När datastrukturen ovan har lästs in ska befolkningstätheten beräknas och lagras som en ny instansvariabel och detta ska ske m h a en metod. "

Jag förstår mig inte riktigt på det där med klass och metod, ska värdena för respektive objekt läggas till i en lista under metoden __init__ eftersom de inte beror av någon variabel? Varje funktion jag försöker räkna ut folktätheten med känner inte igen argumenten som jag definierat under __init__ och programmet kraschar. De här 4 raderna lyckas iallafall printa ut listan:

with open(r'C:\Users\Downloads\europa.txt') as fil:
    lista = [line.split() for line in fil]
    for x in range (50):
       print(' '.join(lista[0+x]))

Är detta en bra början?

class info:
    def __init__(self, land, yta, folkmängd):
        self.land = land
        self.yta = yta
        self.folkmängd = folkmängd
i = info()
Laguna Online 28443
Postad: 21 sep 2022 06:00

Det ser vettigt ut, men du måste ange de tre värdena när du skapar objektet.

Sedan, hur räknar du ut befolkningstäthet?

Fermatrix 7841 – Fd. Medlem
Postad: 21 sep 2022 10:05

Om du skapar en ny metod och vill referera till värderna du sätter i konstruktorn måste metoden ta emot argumentet self.

On det inte är det du menar får du visa vad du menar med kod och en förklaring.

anony123 163 – Fd. Medlem
Postad: 21 sep 2022 13:31
Laguna skrev:

Det ser vettigt ut, men du måste ange de tre värdena när du skapar objektet.

Sedan, hur räknar du ut befolkningstäthet?

Filen vi fick består av tre kolumner med information. Många av ländernas namn är skilda med mellanslag, ex San Marino, och då hamnar San i kolumn 1 och Marino i kolumn 2 om man använder denna kod. Vet inte hur jag ska ange en viss kolumn som ett värde.

[line.split()[0] for line in fil]

Befolkningstätheten räknar jag såhär precis under __init__ men den säger att folktätheten inte är definerad.

 def folktäthet(self):
        return self.folkmängd / self.yta

f = folktäthet()
Laguna Online 28443
Postad: 21 sep 2022 13:43 Redigerad: 21 sep 2022 13:44

Är det möjligen tab-tecken som skiljer kolumnerna åt? Då kan du göra split('\t').

folktäthet är en metod (eller ska vara om du har gjort rätt) i klassen info, och då behöver du en instans av info.

T.ex.

i = info("Pingvinön", 1, 2000)
i.folktäthet()

anony123 163 – Fd. Medlem
Postad: 21 sep 2022 13:52 Redigerad: 21 sep 2022 14:14
Laguna skrev:

Är det möjligen tab-tecken som skiljer kolumnerna åt? Då kan du göra split('\t').

folktäthet är en metod (eller ska vara om du har gjort rätt) i klassen info, och då behöver du en instans av info.

T.ex.

i = info("Pingvinön", 1, 2000)
i.folktäthet()

Så här ser några rader ut i filen:

Vatican City,	0.44,		900
Malta,		316,		397499
San Marino,	61,		27730

I det här fallet ( i = info("Pingvinön", 1, 2000) ) har man trevliga värden men den info jag sätter inom parentesen måste väl vara hela kolumner från filen för att slippa skapa en info() variabel för alla värden? Den verkar inte kunna ta en list som argument.

Laguna Online 28443
Postad: 21 sep 2022 16:27

Tydligen är det kommatecken som är separator.

Varje rad blir en info-instans.

anony123 163 – Fd. Medlem
Postad: 22 sep 2022 22:52 Redigerad: 22 sep 2022 23:32
Laguna skrev:

Tydligen är det kommatecken som är separator.

Varje rad blir en info-instans.

Så hur får jag länderna i en kolumn , sep=vadå ? Var det såhär du menade?

class info:
    def __init__(self, land, yta, population):
        self.land = land
        self.yta = yta
        self.population = population
    def nation(self):
        with open(r'C:\Users\Downloads\europa.txt') as fil:
            return [line.split()[0] for line in fil]
    def area(self):
        with open(r'C:\Users\Downloads\europa.txt') as fil:
            return [line.split()[1] for line in fil]
    def befolkning(self):
        with open(r'C:\Users\Downloads\europa.txt') as fil:
            return [line.split()[2] for line in fil]
    def folktäthet(self):
        return befolkning/area ???
Laguna Online 28443
Postad: 22 sep 2022 23:27

Nej. Läs in en rad i taget från filen. Dela upp raden med split. Gör en info-instans av det som står på raden.

info-instanserna får du samla i en lista.

anony123 163 – Fd. Medlem
Postad: 22 sep 2022 23:41 Redigerad: 22 sep 2022 23:41
Laguna skrev:

Nej. Läs in en rad i taget från filen. Dela upp raden med split. Gör en info-instans av det som står på raden.

info-instanserna får du samla i en lista.

fil =  open(r'C:\Users\Downloads\europa.txt')
read = fil.readlines()

Såhär? Den går inte att använda split() på och .readline() lagrar bara första raden.

Laguna Online 28443
Postad: 22 sep 2022 23:46

Du får använda en loop.

anony123 163 – Fd. Medlem
Postad: 23 sep 2022 14:23
Laguna skrev:

Du får använda en loop.

Ungefär som jag skrev i början?

with open(r'C:\Users\Downloads\europa.txt') as fil:
    lista = [line.split() for line in fil]
    for x in range (50):
        l = lista[0+x]
Laguna Online 28443
Postad: 23 sep 2022 15:30

Ungefär, men varför anta 50?

anony123 163 – Fd. Medlem
Postad: 23 sep 2022 15:50

Filen är 50 rader lång

Laguna Online 28443
Postad: 24 sep 2022 11:38

Jag antar att du vet det för att du har räknat själv. Det är inte bra att anta sådana saker. Nästa gång programmet används kanske infilen är annorlunda.

Du kan göra så här:

for l in lista:
     gör nåt med l

Eller som du på sätt och vis redan har gjort:

for line in fil:
     gör nåt med line.split()

Svara Avbryt
Close