String zu Liste convertieren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
frcom
User
Beiträge: 49
Registriert: Sonntag 24. September 2017, 19:35

Hallo an Alle,

Mein Problem ist wahrscheinlich recht einfach zu lösen:
Ich möchte in meinem Programm eine Nukleotidsequenz eingeben und in der Art in triplets unterteilen :
input: 'ATCGTG...'
output: ['ATC', 'TCG', 'CGT', 'GTG']

gibt es da in der list() -function eine Möglichkeit das leicht umzusetzen oder muss ich den Inputstring in eine Liste umwandeln und dann in einer while- oder for-schleife immer 3 Positionen wieder zusammenfügen?

Code: Alles auswählen

neu = []
for i in range(len(list(input))-2):
	codon = input[i]+[input[i+1]+input[i+2]
	neu.append(codon)
Danke für eure Hilfe!
Bolitho
User
Beiträge: 219
Registriert: Donnerstag 21. Juli 2011, 07:01
Wohnort: Stade / Hamburg
Kontaktdaten:

Code: Alles auswählen

input = 'ATCGTGATC'
neu = []
for i in range(len(input)-2):   
    codon = input[i:i+3]              # Stringkette[0:2] -> Stringkette[2:4] usw.
    neu.append(codon)

print(neu)
Zuletzt geändert von Bolitho am Montag 14. Mai 2018, 10:57, insgesamt 1-mal geändert.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Code: Alles auswählen

zip(input, input[1:], input[2:])

Code: Alles auswählen

[input[i:i+3] for in in range(len(input) - 2)]
Das Leben ist wie ein Tennisball.
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@Bolitho: die Überlappungen sind gewünscht. Du teilst den String in 3er-Päckchen.

@EyDu: bei Deiner zip-Lösung bekommst Du einen Iterator von Tuplen, für das gewünschte Ergebnis also:

Code: Alles auswählen

neu = [''.join(t) for t in zip(input, input[1:], input[2:])]
Bolitho
User
Beiträge: 219
Registriert: Donnerstag 21. Juli 2011, 07:01
Wohnort: Stade / Hamburg
Kontaktdaten:

Sirius3 hat geschrieben: Montag 14. Mai 2018, 10:53 @Bolitho: die Überlappungen sind gewünscht. Du teilst den String in 3er-Päckchen.
Danke, hatte die Aufgabe falsch gelesen/verstanden. Ist korrigiert oben.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Sirius3 hat geschrieben: Montag 14. Mai 2018, 10:53 @EyDu: bei Deiner zip-Lösung bekommst Du einen Iterator von Tuplen,
Eigentlich war ich nur zu faul ^^ In dem Fall könnte man auch einfach

Code: Alles auswählen

list(map("".join, zip(input, input[1:], input[2:])))
schreiben. Aber ob das schöner ist als eine LC? ^^
Das Leben ist wie ein Tennisball.
Benutzeravatar
noisefloor
User
Beiträge: 3853
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

ich finde bei sowas eine Lösung mit `deque`auch immer schön:

Code: Alles auswählen

>>> from collections import deque
>>> data = 'ATCGTG'
>>> d = deque(maxlen=3)
>>> res = []
>>> for i in data:
...     d.append(i)
...     if len(d)==3:
...         res.append(''.join(d))
...
>>> res
['ATC', 'TCG', 'CGT', 'GTG']
>>>
Gruß, noisefloor
frcom
User
Beiträge: 49
Registriert: Sonntag 24. September 2017, 19:35

super, vielen Dank euch allen!

Bei mir hat sich nun die nächste Frage aufgetan:
Ich habe die entstandene Liste nun in einer Funktion nach dem Startcodon, bzw. dem string 'AUG' durchsucht und alle Triplets davor gelöscht. Das funktioniert auch prima, nur kenne ich ja nun den Start und brauche die Überlappungen nicht mehr. Sprich jeder 2. und 3. string in der Liste kann/soll gelöscht werden.
Habt ihr Tipps, wie ihr hier ansetzen würdet?

Danke schon mal,

frcom
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@frcom: dann willst Du eigentlich was ganz anderes und die ursprüngliche Lösung Bolitho war doch ganz richtig.

Code: Alles auswählen

start = input.find(STARTCODON)
codons = [input[i : i+3] for i in range(start, len(input), 3)]
frcom
User
Beiträge: 49
Registriert: Sonntag 24. September 2017, 19:35

@sirius3: brauche ich nicht zum finden des Startcodons erst alle möglichen triplets? und ab dem Moment, ab dem ich die Position des Startcodons weiß nur noch in 3er schritten weiterführend?

und ansonsten brauche ich für andere Aufgaben, die das Programm erledigen soll (wie alignments erstellen etc.) sowieso alle möglichen Triplets...
gibts da die dann eine Möglichkeit oder muss ich je nachdem was ich nun genau mit der sequenz anstellen will unterschiedliche Funktionen durchlaufen?
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

Das Durcharbeiten eines Python-Tutorials würde helfen, solche und weitere Fragen beantworten.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@frcom: Das Startcodon könntest Du mit str.find ausfindig machen und dann mit der Zerlegung fortfahren. Python macht die Aufgabe einfach, automatisiert sie für Dich aber nicht. Mit den bisherigen Hinweisen müsstest Du das aber hinkriegen – grundlegende Pythonkenntnisse vorausgesetzt.
frcom
User
Beiträge: 49
Registriert: Sonntag 24. September 2017, 19:35

Okay alles klar! Habe es hinbekommen...
Danke euch allen!
Antworten