12 svar
639 visningar
nilson99 behöver inte mer hjälp
nilson99 258 – Avstängd
Postad: 11 dec 2019 11:43

matris koordinater i textfil?

Problemet är att jag har en textfil som innehåller koordinater för en matris som ser ut såhär:

x-koord y-koord
===============
2 3
2 4
3 4
3 6
4 2
4 3
4 5

siffrorna ska alltså vara platser i matrisen, tex 2 3 är rad 2 kolumn 3 på en matris full med nollor. Hur ska jag få datorn att förstå att dessa är rader och kolumner för en matris med nollor och att den skall ersätta nollan med en etta för rad 2 kolumn 3 och så vidare?

Laguna Online 30472
Postad: 11 dec 2019 12:21

Skapa matrisen först, med bara nollor i. Jag antar att du vet hur stor den ska vara. Öppna filen, läs en rad i taget, dela upp den i de två talen, sätt rätt element i matrisen till ett, tills filen är slut. 

nilson99 258 – Avstängd
Postad: 11 dec 2019 14:07
Laguna skrev:

Skapa matrisen först, med bara nollor i. Jag antar att du vet hur stor den ska vara. Öppna filen, läs en rad i taget, dela upp den i de två talen, sätt rätt element i matrisen till ett, tills filen är slut. 

jag har en skapad matris med bara nollor i redan och storleken är bestämd. jag öppnar filen och gjorde att den ska läsa en rad i taget. Sen är jag helt lost...

Laguna Online 30472
Postad: 11 dec 2019 14:21
nilson99 skrev:
Laguna skrev:

Skapa matrisen först, med bara nollor i. Jag antar att du vet hur stor den ska vara. Öppna filen, läs en rad i taget, dela upp den i de två talen, sätt rätt element i matrisen till ett, tills filen är slut. 

jag har en skapad matris med bara nollor i redan och storleken är bestämd. jag öppnar filen och gjorde att den ska läsa en rad i taget. Sen är jag helt lost...

Då är det ju nästan färdigt. Visa koden.

Lindehaven 820 – Lärare
Postad: 11 dec 2019 17:13
Laguna skrev:

Skapa matrisen först, med bara nollor i. Jag antar att du vet hur stor den ska vara. Öppna filen, läs en rad i taget, dela upp den i de två talen, sätt rätt element i matrisen till ett, tills filen är slut. 

Eller skapa först en tom matris som kan hålla talen parvis. Öppna filen, läs en rad i taget, dela upp raden i två tal, lägg till talen till matrisen och repetera detta till dess filen är slut. På detta vis behöver du inte veta i förväg hur stor matrisen behöver vara utan det beror av hur många koordinater som filen innehåller.

Visa oss koden så ser vi bättre vad du försökt.

Laguna Online 30472
Postad: 11 dec 2019 19:52
Lindehaven skrev:
Laguna skrev:

Skapa matrisen först, med bara nollor i. Jag antar att du vet hur stor den ska vara. Öppna filen, läs en rad i taget, dela upp den i de två talen, sätt rätt element i matrisen till ett, tills filen är slut. 

Eller skapa först en tom matris som kan hålla talen parvis. Öppna filen, läs en rad i taget, dela upp raden i två tal, lägg till talen till matrisen och repetera detta till dess filen är slut. På detta vis behöver du inte veta i förväg hur stor matrisen behöver vara utan det beror av hur många koordinater som filen innehåller.

Visa oss koden så ser vi bättre vad du försökt.

Då antar du att sista raden och sista kolumnen inte innehåller bara nollor.

Naturligtvis kan man representera matrisen direkt med den här ett-listan, och det tänkte jag inte på. Jag tänkte mig något som man direkt kan indexera med två index.

Precis hur är uppgiften formulerad?

Lindehaven 820 – Lärare
Postad: 12 dec 2019 09:55

Du behöver metoden split() som kan dela din inlästa rad vid det mellanslagstecken som ligger mellan x- och y-koordinaterna.

Einish 4 – Avstängd
Postad: 12 dec 2019 18:58

Koda ihop det här lite snabbt, programmet läser input ifrån std input. Pipe:a din text fil till programmet såhär: cat matris.txt | python3 main.py

Med din text fil ser ouput ut såhär:

Lindehaven 820 – Lärare
Postad: 13 dec 2019 12:15

Einish har använt splitlines() som funkar på liknande sätt som split().

Det finns en risk att koordinaterna i filen inte ryms i en matris med en fix storlek. Det kan och bör hanteras i koden, t ex genom att låta matrisen dynamiskt expandera för att tillåta sådana koordinater eller genom att helt enkelt inte försöka ändra i matrisen.

Lindehaven 820 – Lärare
Postad: 16 dec 2019 21:34

En funktion för matriser av fix storlek:

Visa spoiler

def build_matrix(filename, rows, columns):

    matrix = [[0 for column in range(columns)] for row in range(rows)]

    with open(filename) as file_handle:
        line_text = file_handle.readline()
        while line_text:
            value_pair = line_text.split()
            row = int(value_pair[0])
            column = int(value_pair[1])
            if row < 0 or row > rows-1 or column < 0 or column > columns-1:
                matrix = []
                break
            matrix[row][column] = 1
            line_text = file_handle.readline()
    return matrix

En funktion för matriser av variabel storlek:

Visa spoiler

def build_matrix(filename):
    value_pairs = []
    rows = 0
    columns = 0
    with open(filename) as file_handle:
        line_text = file_handle.readline()
        while line_text:
            value_pair = line_text.split()
            value_pairs.append([int(value_pair[0]), int(value_pair[1])])
            rows = max(rows, int(value_pair[0])+1)
            columns = max(columns, int(value_pair[1])+1)
            line_text = file_handle.readline()
        matrix = [[0 for column in range(columns)] for row in range(rows)]
        for row, column in value_pairs:
            matrix[row][column] = 1
    return matrix if matrix else None

nilson99 258 – Avstängd
Postad: 20 jan 2020 13:31 Redigerad: 20 jan 2020 13:35
Lindehaven skrev:

En funktion för matriser av fix storlek:

Visa spoiler

def build_matrix(filename, rows, columns):

    matrix = [[0 for column in range(columns)] for row in range(rows)]

    with open(filename) as file_handle:
        line_text = file_handle.readline()
        while line_text:
            value_pair = line_text.split()
            row = int(value_pair[0])
            column = int(value_pair[1])
            if row < 0 or row > rows-1 or column < 0 or column > columns-1:
                matrix = []
                break
            matrix[row][column] = 1
            line_text = file_handle.readline()
    return matrix

En funktion för matriser av variabel storlek:

Visa spoiler

def build_matrix(filename):
    value_pairs = []
    rows = 0
    columns = 0
    with open(filename) as file_handle:
        line_text = file_handle.readline()
        while line_text:
            value_pair = line_text.split()
            value_pairs.append([int(value_pair[0]), int(value_pair[1])])
            rows = max(rows, int(value_pair[0])+1)
            columns = max(columns, int(value_pair[1])+1)
            line_text = file_handle.readline()
        matrix = [[0 for column in range(columns)] for row in range(rows)]
        for row, column in value_pairs:
            matrix[row][column] = 1
    return matrix if matrix else None

tack enormt för allas hjälp! Testade din funktion för matris av variabel storlek och vid första raden då vi definierar funktionen blir det syntax error när jag fyller i filename. min textfil heter koord. Testade skriva:

def build_matrix(koord.txt)

men det funkade inte, testade att också bara skriva koord, funkade inte heller. 

EDIT: funkade nu!

nilson99 258 – Avstängd
Postad: 20 jan 2020 14:06

En till grej jag funderar över och det är radbrytning. Såhär ser koden ut: 

när jag printar detta får jag ut strängarna i en enda lång rad. Vill göra radbrytning så att det "ser ut" som en NxM matris. Nu skrivs alla listor ut efter varandra i en enda lång rad. Hur ska jag radbryta mellan varje sträng?

Lindehaven 820 – Lärare
Postad: 22 jan 2020 10:49 Redigerad: 22 jan 2020 12:25

Modulen pprint (pretty print) hjälper oss med fina utskrifter. Prova till exempel:

from pprint import pprint

pprint(build_matrix())

Svara
Close