9 svar
215 visningar
Tami 7
Postad: 7 aug 2022 15:49

En fråga gällande klasser och objekter

Hej!

Jag fick en fråga där ser ut som följande,

Definiera klassen DnaSeq som har två attribut: en unik identifierare (även känd som ett accession, på
engelska) och en DNA-sekvens. Kalla attributen accession och seq. Det ska vara möjligt att skapa ett
DnaSeq-objekt så här:
my_seq = DnaSeq('abc123', 'ACGTACGT')

Implementera funktionen read_dna(), som givet ett filnamn som parameter returnerar en lista med
DnaSeq-objekt som representerar sekvenserna i filen. Filformatet är som följer:
• En fil är en rad med “poster” (eng: records).
• Varje post innehåller en id-rad (eng: accession line) och en sekvensrad.
• En identifierare är unik i filen, representeras av en enkelt sträng, och kommer efter ett
större-än-tecken (>) som inte är del av identifieraren.
• En sekvens är en sträng av bokstäverna A, C, G, och T.
• Det kan finnas tomrader mellan posterna. Dessa tomrader ska ignoreras. Tips: tomrader har inte
längd 0, eftersom det finns alltid ett nyradstecken (skrivs som \n) när man läser in en tomrad.
Här är ett enkelt exempel:
>s123
ACGGACGT
>abc
GATTACA
>X20
AAAAAAGAATTACCCACACACAC

 

koden som jag har skrivit ser ut så här men tyvärr kan inte gå igenom testscriptet som jag har redan fått.

class DnaSeq:
def __init__(self, accession, seq):
self.accession = accession
self.seq = seq

def __len__(self):
return len(self.seq)

def __str__(self):
return f'<DnaSeq accession={self.accession}>' # python f_strings

 

def read_dna(filename):
seq_obj = []
with open(filename, "r") as h:
for line in h: # för rader i textfilen
if ">" not in line:
seq_obj.append(line)
return seq_obj

 

testscript:

def test_reading():
dna1 = read_dna('ex1.fa')
assert len(dna1) == 6, 'The file "ex1.fa" has exactly 6 sequences, but your code does not return that.'
assert list(map(lambda x: x.accession, dna1)) == [f's{i}' for i in range(6)], 'The accessions are not read correctly'
print('read_dna passed')
test_reading()

 

Jag sitter verkligen fast med denna fråga, kommer bli jättetacksam av alla hjälp :)

Tack på förhand

Laguna Online 28602
Postad: 7 aug 2022 16:04

Vad står det i ex1.fa?

Tami 7
Postad: 7 aug 2022 16:29
Laguna skrev:

Vad står det i ex1.fa?

Det står så här:

>s0
ATGTTTGTTTTTCTTGTTTTATTGCCACTAGTCTCTAGTCAGTGTGTTAATCTTACAACCAGAACTCAAT
>s1
GTTAATCTTACAACCAGAACTCAATTACCCCCTGCATACACTAATTCTTTCACACGTGGTGTTTATTACCCTGACAAAGTTTTCAGATCCTCAGTTTTACATTCAACTCAGGACTTGTTCTTACCTTTCTTTTCCAATGTTACTTGGTTCCATGCTATACATGTC
>s2
ACTCAGGACTTGTTCTTACCTTTCTTTTCCAATGTTACTTGGTTCCATGCTATACATGTCTCTGGGACCAATGGTACTAAGAGGTTTGATAACCCTGTCCTAC
>s3
TCTGGGACCAATGGTACTAAGAGGTTTGATAACCCTGTCCTACCATTTAATGATGGTGTTTATTTTGCTTCCACTGAGAAGTCTAACATAATAAGAGGCTGGATTTTTGGTACTACTTTAGATTCGAAGACCCAGTCCCT
>s4
AGACCCAGTCCCTACTTATTGTTAATAACGCTACTAATGTTGTTATTAAAGTCTGTGAATTTCAATTTTGTAATGATCCATTT
>s5
TTTGTAATGATCCATTTTTGGGTGTTTATTACCACAAAAACAACAAAAGTTGGATGGAAAGTGAGTTCAGAGTTTATTCTAGTGCGA

Laguna Online 28602
Postad: 7 aug 2022 16:41

Det du returnerar ska vara en lista av DnaSeq, som innehåller både accession och seq, men du gör bara en lista av seq.

Tami 7
Postad: 7 aug 2022 16:47
Laguna skrev:

Det du returnerar ska vara en lista av DnaSeq, som innehåller både accession och seq, men du gör bara en lista av seq.

 Är det inte att den ska innehålla bara seq"en lista med DnaSeq-objekt som representerar sekvenserna i filen"? menar du att man måste returnera hela raden?

Laguna Online 28602
Postad: 7 aug 2022 16:51

Det står att du ska returnera DnaSeq-objekt och det står ett exempel på hur man skapar ett sådant.

Det vore väl konstigt om de ber dig att skriva kod som inte används.

Tami 7
Postad: 7 aug 2022 17:02
Laguna skrev:

Det står att du ska returnera DnaSeq-objekt och det står ett exempel på hur man skapar ett sådant.

Det vore väl konstigt om de ber dig att skriva kod som inte används.

Akan, men kanske jag var inte så tydligt. Det är nämligen så här att jag fick 2 textfiler och den här koden ">s123
ACGGACGT
>abc
GATTACA
>X20
AAAAAAGAATTACCCACACACAC"

är textfil nummer 0(ex0.fa) och den andra somjag har använt i koden är textfil nummer 1 dvs (ex1.fa).

asså när jag frågade exakt hur read_dna() ska funka, de sa att "varje accession och sträng i inläsningsfilen ska vara kopplade till ett objekt av klassen DnaSeq". och det var det som jag hängde inte med för att i själva koden def read_dna() har definieras utanför klassen och det räknas inte som en metod av klassen DnaSeq. blir jättetacksam ifall du kan hjälpa mig lite mer med att förstå vad egentligen ska göras

Laguna Online 28602
Postad: 7 aug 2022 17:10

Din kod hoppar helt över rader som börjar med >, dvs. du sparar inte accession någonstans.

Tami 7
Postad: 7 aug 2022 17:16
Laguna skrev:

Din kod hoppar helt över rader som börjar med >, dvs. du sparar inte accession någonstans.

För att jag vill koden göra så, jag uppfattade från frågan "en lista med DnaSeq-objekt som representerar sekvenserna i filen" att man måste bara sparar seq(sekvenser), är detta inte rätt? annars ska den göras med en vanligt readlines() och for loop, är det, det som tanken??

Laguna Online 28602
Postad: 7 aug 2022 19:31

Återigen: du ska skapa DnaSeq-objekt. Det gör din kod inte.

Svara Avbryt
Close