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')
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.
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
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
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
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()
Wow kan inte tacka dig nog! Allt blev mycket tydligare nu!