Python en for loops
Geplaatst: di 08 dec 2015, 00:37
Beste
Tijdens een cursus op de universiteit is er een twee uur durende introductie in Python gegeven. De zaken die behandeld werden zijn: types van data, datatype conversie, conditional statements, functies, loops, files lezen en schrijven. Er hangt ook een opdracht aan vast, maar bij opgave drie zit ik vast. (beschrijving opdracht volgt later)
De data die verwerkt moet worden, is biologische data: eiwitsequenties uit een databank. Dat ziet er zo uit:
>sp|P13280|GLYG_RABIT Glycogenin-1 OS=Oryctolagus cuniculus GN=GYG1 PE=1 SV=3
MTDQAFVTLTTNDAYAKGALVLGSSLKQHRTSRRLAVLTTPQVSDTMRKALEIVFDEVIT
VDILDSGDSAHLTLMKRPELGVTLTKLHCWSLTQYSKCVFMDADTLVLANIDDLFEREEL
SAAPDPGWPDCFNSGVFVYQPSVETYNQLLHVASEQGSFDGGDQGLLNTFFNSWATTDIR
KHLPFIYNLSSISIYSYLPAFKAFGANAKVVHFLGQTKPWNYTYDTKTKSVRSEGHDPTM
THPQFLNVWWDIFTTSVVPLLQQFGLVQDTCSYQHVEDVSGAVSHLSLGETPATTQPFVS
SEERKERWEQGQADYMGADSFDNIKKKLDTYLQ
De eerste regel, beginnend met >sp, is een header met informatie over het eiwit en de regels daaronder zijn aminozuren. De datafile (FASTA file) bevat zo'n 800 items (de hoeveelheid aminozuren verschilt van eiwit tot eiwit).
Opdracht 3 luidt: Maak een lijst van alle eiwitten die bestaan uit 100 of minder dan 100 aminozuren. Schrijf die in een aparte tekstfile waar zowel de header als de aminozuursequentie instaan.
Ik merkte op dat Python de header steeds als 1 string importeert, maar de aminozuursequenties importeert hij per regel. Daarom is het tellen lastig. Ik wou al die aminozuursequenties (per eiwit) samenvoegen tot 1 nieuwe string. Op die manier wordt het tellen eenvoudiger. Tot nu toe had ik deze code:
f = open("test3.fasta", "r")
for line in f:
if ">sp" in line:
s = str()
#print(s) #geeft geen resultaat
print(line)
#print(s) #geeft geen resultaat
if ">sp" not in line:
s += line
print(s) # probleem: python voegt aan s iedere keer een regel toe en print die in plaats van alle regels tegelijk toe te voege
f.close()
Het probleem is dat Python met deze code iedere keer een string s print als hij een regel tegenkomt die niet begint met >sp, waardoor de output wordt zoals dit (voor de sequentie hierboven):
MTDQAFVTLTTNDAYAKGALVLGSSLKQHRTSRRLAVLTTPQVSDTMRKALEIVFDEVIT
MTDQAFVTLTTNDAYAKGALVLGSSLKQHRTSRRLAVLTTPQVSDTMRKALEIVFDEVIT
VDILDSGDSAHLTLMKRPELGVTLTKLHCWSLTQYSKCVFMDADTLVLANIDDLFEREEL
MTDQAFVTLTTNDAYAKGALVLGSSLKQHRTSRRLAVLTTPQVSDTMRKALEIVFDEVIT
VDILDSGDSAHLTLMKRPELGVTLTKLHCWSLTQYSKCVFMDADTLVLANIDDLFEREEL
SAAPDPGWPDCFNSGVFVYQPSVETYNQLLHVASEQGSFDGGDQGLLNTFFNSWATTDIR
MTDQAFVTLTTNDAYAKGALVLGSSLKQHRTSRRLAVLTTPQVSDTMRKALEIVFDEVIT
VDILDSGDSAHLTLMKRPELGVTLTKLHCWSLTQYSKCVFMDADTLVLANIDDLFEREEL
SAAPDPGWPDCFNSGVFVYQPSVETYNQLLHVASEQGSFDGGDQGLLNTFFNSWATTDIR
KHLPFIYNLSSISIYSYLPAFKAFGANAKVVHFLGQTKPWNYTYDTKTKSVRSEGHDPTM
MTDQAFVTLTTNDAYAKGALVLGSSLKQHRTSRRLAVLTTPQVSDTMRKALEIVFDEVIT
VDILDSGDSAHLTLMKRPELGVTLTKLHCWSLTQYSKCVFMDADTLVLANIDDLFEREEL
SAAPDPGWPDCFNSGVFVYQPSVETYNQLLHVASEQGSFDGGDQGLLNTFFNSWATTDIR
KHLPFIYNLSSISIYSYLPAFKAFGANAKVVHFLGQTKPWNYTYDTKTKSVRSEGHDPTM
THPQFLNVWWDIFTTSVVPLLQQFGLVQDTCSYQHVEDVSGAVSHLSLGETPATTQPFVS
MTDQAFVTLTTNDAYAKGALVLGSSLKQHRTSRRLAVLTTPQVSDTMRKALEIVFDEVIT
VDILDSGDSAHLTLMKRPELGVTLTKLHCWSLTQYSKCVFMDADTLVLANIDDLFEREEL
SAAPDPGWPDCFNSGVFVYQPSVETYNQLLHVASEQGSFDGGDQGLLNTFFNSWATTDIR
KHLPFIYNLSSISIYSYLPAFKAFGANAKVVHFLGQTKPWNYTYDTKTKSVRSEGHDPTM
THPQFLNVWWDIFTTSVVPLLQQFGLVQDTCSYQHVEDVSGAVSHLSLGETPATTQPFVS
SEERKERWEQGQADYMGADSFDNIKKKLDTYLQ
Ik begrijp waarom Python het doet: iedere keer als Python een regel tegenkomt die niet begint met >sp, dan wijzigt de waarde van s en wordt de huidige waarde van s geprint. Ik wil echter enkel dat laatste (de hele sequentie), maar ik heb geen idee hoe dat te doen.
Alvast bedankt.
P.S. Die introductie Python is de enige programmeerervaring die ik heb.
Tijdens een cursus op de universiteit is er een twee uur durende introductie in Python gegeven. De zaken die behandeld werden zijn: types van data, datatype conversie, conditional statements, functies, loops, files lezen en schrijven. Er hangt ook een opdracht aan vast, maar bij opgave drie zit ik vast. (beschrijving opdracht volgt later)
De data die verwerkt moet worden, is biologische data: eiwitsequenties uit een databank. Dat ziet er zo uit:
>sp|P13280|GLYG_RABIT Glycogenin-1 OS=Oryctolagus cuniculus GN=GYG1 PE=1 SV=3
MTDQAFVTLTTNDAYAKGALVLGSSLKQHRTSRRLAVLTTPQVSDTMRKALEIVFDEVIT
VDILDSGDSAHLTLMKRPELGVTLTKLHCWSLTQYSKCVFMDADTLVLANIDDLFEREEL
SAAPDPGWPDCFNSGVFVYQPSVETYNQLLHVASEQGSFDGGDQGLLNTFFNSWATTDIR
KHLPFIYNLSSISIYSYLPAFKAFGANAKVVHFLGQTKPWNYTYDTKTKSVRSEGHDPTM
THPQFLNVWWDIFTTSVVPLLQQFGLVQDTCSYQHVEDVSGAVSHLSLGETPATTQPFVS
SEERKERWEQGQADYMGADSFDNIKKKLDTYLQ
De eerste regel, beginnend met >sp, is een header met informatie over het eiwit en de regels daaronder zijn aminozuren. De datafile (FASTA file) bevat zo'n 800 items (de hoeveelheid aminozuren verschilt van eiwit tot eiwit).
Opdracht 3 luidt: Maak een lijst van alle eiwitten die bestaan uit 100 of minder dan 100 aminozuren. Schrijf die in een aparte tekstfile waar zowel de header als de aminozuursequentie instaan.
Ik merkte op dat Python de header steeds als 1 string importeert, maar de aminozuursequenties importeert hij per regel. Daarom is het tellen lastig. Ik wou al die aminozuursequenties (per eiwit) samenvoegen tot 1 nieuwe string. Op die manier wordt het tellen eenvoudiger. Tot nu toe had ik deze code:
f = open("test3.fasta", "r")
for line in f:
if ">sp" in line:
s = str()
#print(s) #geeft geen resultaat
print(line)
#print(s) #geeft geen resultaat
if ">sp" not in line:
s += line
print(s) # probleem: python voegt aan s iedere keer een regel toe en print die in plaats van alle regels tegelijk toe te voege
f.close()
Het probleem is dat Python met deze code iedere keer een string s print als hij een regel tegenkomt die niet begint met >sp, waardoor de output wordt zoals dit (voor de sequentie hierboven):
MTDQAFVTLTTNDAYAKGALVLGSSLKQHRTSRRLAVLTTPQVSDTMRKALEIVFDEVIT
MTDQAFVTLTTNDAYAKGALVLGSSLKQHRTSRRLAVLTTPQVSDTMRKALEIVFDEVIT
VDILDSGDSAHLTLMKRPELGVTLTKLHCWSLTQYSKCVFMDADTLVLANIDDLFEREEL
MTDQAFVTLTTNDAYAKGALVLGSSLKQHRTSRRLAVLTTPQVSDTMRKALEIVFDEVIT
VDILDSGDSAHLTLMKRPELGVTLTKLHCWSLTQYSKCVFMDADTLVLANIDDLFEREEL
SAAPDPGWPDCFNSGVFVYQPSVETYNQLLHVASEQGSFDGGDQGLLNTFFNSWATTDIR
MTDQAFVTLTTNDAYAKGALVLGSSLKQHRTSRRLAVLTTPQVSDTMRKALEIVFDEVIT
VDILDSGDSAHLTLMKRPELGVTLTKLHCWSLTQYSKCVFMDADTLVLANIDDLFEREEL
SAAPDPGWPDCFNSGVFVYQPSVETYNQLLHVASEQGSFDGGDQGLLNTFFNSWATTDIR
KHLPFIYNLSSISIYSYLPAFKAFGANAKVVHFLGQTKPWNYTYDTKTKSVRSEGHDPTM
MTDQAFVTLTTNDAYAKGALVLGSSLKQHRTSRRLAVLTTPQVSDTMRKALEIVFDEVIT
VDILDSGDSAHLTLMKRPELGVTLTKLHCWSLTQYSKCVFMDADTLVLANIDDLFEREEL
SAAPDPGWPDCFNSGVFVYQPSVETYNQLLHVASEQGSFDGGDQGLLNTFFNSWATTDIR
KHLPFIYNLSSISIYSYLPAFKAFGANAKVVHFLGQTKPWNYTYDTKTKSVRSEGHDPTM
THPQFLNVWWDIFTTSVVPLLQQFGLVQDTCSYQHVEDVSGAVSHLSLGETPATTQPFVS
MTDQAFVTLTTNDAYAKGALVLGSSLKQHRTSRRLAVLTTPQVSDTMRKALEIVFDEVIT
VDILDSGDSAHLTLMKRPELGVTLTKLHCWSLTQYSKCVFMDADTLVLANIDDLFEREEL
SAAPDPGWPDCFNSGVFVYQPSVETYNQLLHVASEQGSFDGGDQGLLNTFFNSWATTDIR
KHLPFIYNLSSISIYSYLPAFKAFGANAKVVHFLGQTKPWNYTYDTKTKSVRSEGHDPTM
THPQFLNVWWDIFTTSVVPLLQQFGLVQDTCSYQHVEDVSGAVSHLSLGETPATTQPFVS
SEERKERWEQGQADYMGADSFDNIKKKLDTYLQ
Ik begrijp waarom Python het doet: iedere keer als Python een regel tegenkomt die niet begint met >sp, dan wijzigt de waarde van s en wordt de huidige waarde van s geprint. Ik wil echter enkel dat laatste (de hele sequentie), maar ik heb geen idee hoe dat te doen.
Alvast bedankt.
P.S. Die introductie Python is de enige programmeerervaring die ik heb.