Seite 1 von 1
Problem mit str(x)
Verfasst: Donnerstag 22. November 2012, 23:38
von python_noob
Hi,
bin neu sowohl im Forum als auch in Python.

Ich will ein Programm schreiben, das mir zufällige Basensequenzen ausgibt und vor jede Sequenz eine Zahl anhängt. Mein Code funktioniert aber nicht so ganz. Ich benutz v 3.3.
Code: Alles auswählen
def create_random_string(length=1000):
randomstring = ""
chars = "ACGT"
for i in range(1000):
randomstring += "".join(random.sample(chars, 1)) #zufällige chars anordnen
randomstring = "".join(str(i) for i in randomstring) #zahl pro schleife erhöhen und vor die sequenz schreiben
randomstring = ">"+str(i)+"\n"+randomstring #anschließend ausgabe ">X\nString"
return randomstring
Ausgeben tut mir die Konsole:
File "seq.py", line 11
randomstring = "".join(str(i) for i in randomstring)
^
TabError: inconsistent use of tabs and spaces in indentation
Was soll ich jetzt machen? Liegt das an Python 3.3? Danke

Re: Problem mit str(x)
Verfasst: Donnerstag 22. November 2012, 23:48
von webspider
Die Fehlermeldung ist recht eindeutig: Korrigiere deine Einrückung.
Re: Problem mit str(x)
Verfasst: Freitag 23. November 2012, 00:03
von python_noob
Ja, hab vergessen zu sagen, dass ich schon so gut wie jede Einrückvariation ausprobiert hab.. Klappt trotzdem nicht.
Re: Problem mit str(x)
Verfasst: Freitag 23. November 2012, 00:14
von EyDu
python_noob hat geschrieben:Ja, hab vergessen zu sagen, dass ich schon so gut wie jede Einrückvariation ausprobiert hab.. Klappt trotzdem nicht.
Warum probierst du da selber rum? Such dir einen vernünftigen Editor und dann läuft das von alleine.
Re: Problem mit str(x)
Verfasst: Freitag 23. November 2012, 09:16
von /me
python_noob hat geschrieben:Ja, hab vergessen zu sagen, dass ich schon so gut wie jede Einrückvariation ausprobiert hab.. Klappt trotzdem nicht.
Probiere nicht aus, sondern verwende konsequent 4 Leerzeichen für jede Einrückebene. Suche dir einen Editor der Tabs schon bei der Eingabe in 4 Leerzeichen umwandelt.
Re: Problem mit str(x)
Verfasst: Freitag 23. November 2012, 13:27
von BlackJack
@python_noob: Neben der Einrückung ist das Vorgehen auch nicht optimal und teilweise sehr seltsam.
Zuerst einmal sollte man Zeichenketten aus vielen Teilzeichenketten nicht durch wiederholtes ``+``/``+=`` zusammensetzen. Das ist potentiell sehr ineffizient weil Zeichenketten nicht veränderbar sind, und bei jeder dieser Operationen eine neue erstellt und die Inhalte der beiden alten kopiert werden müssen. Der idiomatische Weg ist es die Teilzeichenketten in einer Liste zu sammeln oder mit einem Iterator zu erstellen und mit der `join()`-Methode zusammen zu setzen.
Dann ist der Ausdruck ``"".join(random.sample(chars, 1))`` unnötig kompliziert. Überleg mal wie das Ergebnis von dem `sample()`-Aufruf hier von der Struktur her *immer* aussieht und was das `join()` damit macht. Das könnte man auch wesentlich einfacher ausdrücken. Letztendlich ist der Rückgabewert von `random.sample()` auch unvorteilhaft für diese Aufgabe. Wenn man *einen* Wert haben möchte, bietet das `random`-Modul eine passendere Funktion.
Bei der Zeile danach bin ich mal gespannt zu hören was Du glaubst, was die bewirken soll‽
Man sollte das vielleicht auch aufteilen in eine Funktion, die eine Sequenz der Länge `length` erstellt (die Variable solltest Du vielleicht auch *benutzen*), und eine, die dann daraus alle Präfixe der Länge 1 bis `length` generiert.
Wobei ich mir nicht ganz sicher bin, ob das wirklich so gewollt ist, dass da 1000 Sequenzen erzeugt werden, die alle den gleichen Präfix haben.
Re: Problem mit str(x)
Verfasst: Samstag 24. November 2012, 15:41
von python_noob
Danke erstmal, hat jetzt doch geklappt.
Bei der Zeile danach bin ich mal gespannt zu hören was Du glaubst, was die bewirken soll‽
Meinst du die
randomstring = "".join(str(i) for i in randomstring) ?
Die setzt vor jede Sequenz eine Zahl, die mit der Schleife hochzählt. Also die erste Sequenz heißt 1, die zweite 2 usw..
Naja, auch wenns ineffizient ist, den Zweck hats erfüllt

Re: Problem mit str(x)
Verfasst: Samstag 24. November 2012, 15:53
von jbs
python_noob hat geschrieben:Danke erstmal, hat jetzt doch geklappt.
Bei der Zeile danach bin ich mal gespannt zu hören was Du glaubst, was die bewirken soll‽
Meinst du die
randomstring = "".join(str(i) for i in randomstring) ?
Die setzt vor jede Sequenz eine Zahl, die mit der Schleife hochzählt. Also die erste Sequenz heißt 1, die zweite 2 usw..
Naja, auch wenns ineffizient ist, den Zweck hats erfüllt

Falsch.
Re: Problem mit str(x)
Verfasst: Samstag 24. November 2012, 17:58
von BlackJack
@python_noob: Die Zeile meinte ich, und sie tut nicht das was Du behauptest. Denk darüber noch einmal nach und probiere den Ausdruck mal mit Beispielwerten aus.
Re: Problem mit str(x)
Verfasst: Dienstag 27. November 2012, 10:42
von BlackJack
Mein Ansatz:
Code: Alles auswählen
#!/usr/bin/env python
# coding: utf-8
from __future__ import print_function
import random
def create_random_string(alphabet, length):
return ''.join(random.choice(alphabet) for _ in range(length))
def iter_prefixes(sequence):
return (sequence[:i] for i in xrange(1, len(sequence) + 1))
def main():
result = '\n'.join(
'>{0}\n{1}'.format(i, prefix)
for i, prefix in enumerate(
iter_prefixes(create_random_string('AGTC', 10)), 1
)
)
print(result)
if __name__ == '__main__':
main()
Wobei ich nicht so sicher bin, dass dieses Ergebnis tatsächlich gewollt ist‽