6 svar
199 visningar
anony123 är nöjd med hjälpen
anony123 163 – Fd. Medlem
Postad: 29 sep 2022 21:17 Redigerad: 29 sep 2022 21:18

Sortering

Vi ska sortera rader ur en fil baserat på olika egenskaper. Att sortera efter kod behövs inte eftersom det redan är gjort i filen. Jag lyckas bara sortera de andra egenskaperna i rätt ordning men hur jag ska printa ut de tillsammans med de resterande värdena vet jag inte. Exempel på en rad i filen: A Alanin hydrofob 89.09.

inp = input('''1 - print table of aminoacids sorted by code
2 - print table of aminoacids sorted by name
3 - print table of aminoacids sorted by group
4 - print table of aminoacids sorted by mm
''')
class aminosyror:
    def __init__(self, kod, namn, grupp, molekylvikt):
        self.kod = kod
        self.namn = namn
        self.grupp = grupp
        self.molekylvikt = molekylvikt
    def code(self):
        with open(r'C:\Users\Downloads\aminosyror.txt') as fil:
            return [line for line in fil]
    def name(self):
        with open(r'C:\Users\Downloads\aminosyror.txt') as fil:
            lista = [line.split()[1] for line in fil]
            return sorted(lista)
    def group(self):
        with open(r'C:\Users\Downloads\aminosyror.txt') as fil:
            return [line.split()[2] for line in fil]
    def mw(self):
        with open(r'C:\Users\Downloads\aminosyror.txt') as fil:
            lista = [line.split()[3] for line in fil]
            lista.remove('75.07')
            lista.remove('89.09')
            print('''75.07 
89.09''')

            return sorted(lista)
a = aminosyror(1,1,1,1)

if int(inp) == 1:
    for v in zip(a.code()):
        print(*v)
elif int(inp) == 2:
    for v in zip(a.name()):
        print(*v)
elif int(inp) == 3:
    for v in zip(a.group()):
        print(*v)
elif int(inp) == 4:
    for v in zip(a.mw()):
        print(*v)
else:
    print('Ogiltigt svar')
CurtJ 1149
Postad: 29 sep 2022 21:59

Jag tänker mig att det är bättre att öppna filen en gång, läsa in alla rader och för varje rad skapa en instans av aminosyror (borde kanske vara singularis) som du sen stoppar in i en lista som du sen sorterar och skriver ut på kommando från menyn.

anony123 163 – Fd. Medlem
Postad: 29 sep 2022 22:12
CurtJ skrev:

Jag tänker mig att det är bättre att öppna filen en gång, läsa in alla rader och för varje rad skapa en instans av aminosyror (borde kanske vara singularis) som du sen stoppar in i en lista som du sen sorterar och skriver ut på kommando från menyn.

Du kommer märka att jag är en expert på ineffektiv kod. Har inte riktigt förstått mig på det här med instanser och instansvariabler men är det såhär du menade att jag skulle börja?

inp = input('''1 - print table of aminoacids sorted by code
2 - print table of aminoacids sorted by name
3 - print table of aminoacids sorted by group
4 - print table of aminoacids sorted by mm
''')
fil = open(r'C:\Users\Downloads\aminosyror.txt')
read = fil.readlines()

class aminosyror:
    def __init__(self, kod, namn, grupp, molekylvikt):
        self.kod = kod
        self.namn = namn
        self.grupp = grupp
        self.molekylvikt = molekylvikt
CurtJ 1149
Postad: 29 sep 2022 22:21

Ja det är en bra början men börja med att definiera klassen aminosyra (notera singularis eftersom en instans representerar en aminosyra)

 

Pseudokod

Definiera klass aminosyra

Öppna fil

Läs in fil till en lista av rader

För varje rad

    Skapa en instans av aminosyra

Skriv ut meny och fråga efter val

Om val1

    Sortera lista enligt alt 1

Om val2

    Sortera lista enligt alt 2

osv...

Skriv ut lista

 

Sen gäller det att fundera på hur du sorterar och hur du skriver ut. Jag föreslår att du skapar en klassmetod i klassen aminosyra som skriver ut innehållet i den instansen så blir utskriften enklare

Börja där och återkom

anony123 163 – Fd. Medlem
Postad: 30 sep 2022 00:13

Nu blev jag förvirrad, den första koden jag skrev fungerar för input==1 och kan sortera kolumnerna i filen i rätt ordning men jag visste bara inte hur jag skulle printa hela listan. Dessa tre rader är sorterade efter grupp (basiska) men jag lyckas bara printa grupperna i rätt ordning, dvs resten av infon följer inte med. Hur skiljer sig din kod från min?

H Histidin basisk 155.16
K Lysin basisk 146.19
R Arginin basisk 174.2
CurtJ 1149
Postad: 30 sep 2022 00:32

Ja det beror på följande rad

return [line.split()[2] for line in fil]

som skapar en ny  lista innehållande endast det tredje elementet i varje rad, dvs gruppen.

Jag tror du har fått klasser och objekt/instanser lite om bakfoten.  En klass är en mall för ett datapaket som kan innehålla data (attribut) och funktion (metoder). Man använder sen klassen för att skapa instanser av den typen. Ett enkelt exempel är din klass Aminosyra som innehåller attributen Typ, Namn, Grupp och Molekyvikt. Sen skapar du ett objekt/instans av denna klassen för varje aminosyra som finns i filen och lägger in instansen i en lista som du sen kan manipulera. 

Du skapar instansen mha aminosyror (1,1,1,1) vilket innebär att du skapar en aminorsyra med kod=1, Namn = 1, Grupp=1 och molekylvikt=1. Det är inte rimligt och nog inte vad du menar.

Jag bifogar en kommenterad lösning på ditt problem, du får ändra sökvägen till filen efter din miljö.  Du kan titta på den och fundera på hur den skiljer sig. Har du fler frågor så återkom, jag svarar i morgon

Visa spoiler
from operator import attrgetter


#
# Definiera klassen aminosyra som representerar en  särskild
# aminosyra
#
class Aminosyra:

    #
    # Konstruktor som tolkar en textrad enl formatet "A Alanin hydrofob 89.09"
    #
    def __init__(self, line_from_file):
        tokens = line_from_file.split()
        self.code = tokens[0]
        self.name = tokens[1]
        self.group = tokens[2]
        self.mw = tokens[3]

    #
    # Getters om det behövs
    #
    def get_code(self):
        return self.code

    def get_name(self):
        return self.name

    def get_group(self):
        return self.group

    def get_mw(self):
        return self.mw

    #
    # Skriv ut den här instansen
    #
    def print_me(self):
        print(self.code, self.name, self.group, self.mw)


#
# Sorteringsmetoder, används av sorted()
#
def sort_by_code(inst):
    return inst.get_code()


def sort_by_name(inst):
    return inst.get_name()


def sort_by_group(inst):
    return inst.get_group()


#
# Lista av instanser av klassen aminosyra
#
list_of_aminosyror = []

#
# Öppna och läs in raderna i textfilen, struktur är A Alanin hydrofob 89.09
#
fil = open(r'aminosyror.txt')
lines = fil

#
# Skapa instanser av aminosyran. Konstruktorn tolkar raden
#
for line in lines:
    list_of_aminosyror.append(Aminosyra(line))

#
# Skriv ut menyn
#
inp = input('''1 - print table of aminoacids sorted by code
2 - print table of aminoacids sorted by name
3 - print table of aminoacids sorted by group
4 - print table of aminoacids sorted by mm
''')

#
# Hantera menyvalet, sortera efter valt alternativ
# Obs olika sätt att sortera
#
if int(inp) == 1:
    print('\n***** Sorted by code ****\n')
    sorted_list = sorted(list_of_aminosyror, key=lambda s: s.code)
elif int(inp) == 2:
    print('\n**** Sorted by name *****\n')
    sorted_list = sorted(list_of_aminosyror, key=sort_by_name)

elif int(inp) == 3:
    print('\n**** Sorted by group *****\n')
    sorted_list = sorted(list_of_aminosyror, key=sort_by_group)

elif int(inp) == 4:
    print('\n***** Sorted by mw ****\n')
    sorted_list = sorted(list_of_aminosyror, key=attrgetter('mw'))

#
# Skriv ut den sorterade listan
#

for syra in sorted_list:
    syra.print_me()
anony123 163 – Fd. Medlem
Postad: 30 sep 2022 00:45

Wow kan inte tacka dig nog! Allt blev mycket tydligare nu!

Svara Avbryt
Close