12 svar
163 visningar
nilson99 är nöjd med hjälpen!
nilson99 294
Postad: 11 dec 2019

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 7362
Postad: 11 dec 2019

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 294
Postad: 11 dec 2019
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 7362
Postad: 11 dec 2019
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.

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 7362
Postad: 11 dec 2019
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?

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

Einish 24 – Avstängd
Postad: 12 dec 2019

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:

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.

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 294
Postad: 20 jan 2020 Redigerad: 20 jan 2020
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 294
Postad: 20 jan 2020

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 357 – Leg. Lärare
Postad: 22 jan 2020 Redigerad: 22 jan 2020

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

from pprint import pprint

pprint(build_matrix())

Svara Avbryt
Close