Problem mit str(x)

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
python_noob
User
Beiträge: 3
Registriert: Donnerstag 22. November 2012, 23:24

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 :)
Zuletzt geändert von Anonymous am Freitag 23. November 2012, 10:20, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

Die Fehlermeldung ist recht eindeutig: Korrigiere deine Einrückung.
python_noob
User
Beiträge: 3
Registriert: Donnerstag 22. November 2012, 23:24

Ja, hab vergessen zu sagen, dass ich schon so gut wie jede Einrückvariation ausprobiert hab.. Klappt trotzdem nicht.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
Das Leben ist wie ein Tennisball.
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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.
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.
python_noob
User
Beiträge: 3
Registriert: Donnerstag 22. November 2012, 23:24

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 ;)
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

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.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
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.
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‽
Antworten