14 svar
130 visningar
Baguesses är nöjd med hjälpen
Baguesses 95
Postad: 20 sep 23:32 Redigerad: 20 sep 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 21065
Postad: 21 sep 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?

Dracaena 5501 – Moderator
Postad: 21 sep 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.

Baguesses 95
Postad: 21 sep 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 21065
Postad: 21 sep 13:43 Redigerad: 21 sep 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()

Baguesses 95
Postad: 21 sep 13:52 Redigerad: 21 sep 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 21065
Postad: 21 sep 16:27

Tydligen är det kommatecken som är separator.

Varje rad blir en info-instans.

Baguesses 95
Postad: 22 sep 22:52 Redigerad: 22 sep 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 21065
Postad: 22 sep 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.

Baguesses 95
Postad: 22 sep 23:41 Redigerad: 22 sep 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 21065
Postad: 22 sep 23:46

Du får använda en loop.

Baguesses 95
Postad: 23 sep 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 21065
Postad: 23 sep 15:30

Ungefär, men varför anta 50?

Baguesses 95
Postad: 23 sep 15:50

Filen är 50 rader lång

Laguna Online 21065
Postad: 24 sep 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