2017-02-21 8 views
0

Wie übergibt man eine Zeichenfolge an eine Variable, wenn ein Indexfehler gefunden wird? Betrachten Sie den Code:Variable zuweisen, wenn Listenindex außerhalb des Bereichs liegt Python-Fehler

for l1, l2 in zip(open('file1.list'), open ('file2.list')): 
    a=fasta1[int(l1)] 
    b=fasta2[int(l2)] 

    alignments = pairwise2.align.globalxx(a,b) 
    top_aln = alignments[0] 
    aln_a, aln_b, score, begin, end = top_aln 
    print aln_a+'\n'+aln_b 
    outfast1 = aln_a 
    outfast2 = aln_b 

Eine Reihe dieser Funktionen importiert werden müssen (pairwise2 align), aber die file.lists sind einzelne Spalte Textdateien mit einer Sequenz-ID (Text und Zahlen) pro Zeile, die verwendet werden, Aus den Fasta1- und Fasta2-Textdateien extrahieren.

Grundsätzlich mag ich try: jede Liste Befehl (a=fasta1[int(l1)]) und wenn kein Fehler vorhanden ist (die ID ist in Reichweite), als normal tun (Variablen a und b für diese Iteration zuordnen), aber wenn nicht, weist die ‚a‘ Variable einig Platzhalter-Text wie ‚GGG‘:

for l1, l2 in zip(open('file1.list'), open ('file2.list')): 
try: 
    a=fasta1[int(l1)] 
except IndexError,e: 
    a="GGG" 
continue 

try: 
    b=fasta2[int(l2)] 
except (IndexError): 
    b="CCC" 
continue 

Dieser Code funktioniert nicht ganz (bei obigem Code integriert), was nicht verwunderlich ist mein Mangel an python Fähigkeiten, aber ich don‘ Ich weiß ganz genau warum. Ich bekomme trotz der Druckaufrufe tatsächlich keine Textausgabe ... Denke ich über dieses Recht nach? Wenn es keinen Fehler im Index gibt, möchte ich, dass es weitergeht und die paarweise Ausrichtung (mit den ersten a- und b-Variablen) ausführt und dann etwas Text auf stdout druckt.

Irgendwelche Ideen?

+0

Ist Ihr Einzug korrekt? Ist die '' 'continue''' Anweisung in der Ausnahme-Suite? – wwii

+0

Verstehst du, dass, wenn ['' continue'''] (https://docs.python.org/3/reference/simple_stmts.html#the-continue-statement) ausgeführt wird, alles, nachdem es übersprungen wurde und die nächste Iteration beginnt? – wwii

+0

Ich dachte, es sollte mit dem Versuch/außer abgestimmt werden? Python markiert diese Einzugsstruktur nicht, aber es funktioniert nicht obv. Ich möchte fortfahren, wenn es keinen Indexfehler gibt – user95146

Antwort

1

Pythons conditional (alias ternäre) Ausdrücke können dies für Sie ein-Zeile. Sie werden oft wegen mangelnder Lesbarkeit kritisiert, aber ich denke, dieses Beispiel liest sich gut genug.

a = fasta1[int(l1)] if int(l1) < len(fasta1) else "GGG" 
0

Sie brauchen nicht continue, weil es, dass die Wiederholung der Schleife überspringen wird. Berücksichtigen Sie Folgendes:

for l1, l2 in zip(open('file1.list'), open ('file2.list')): 
a = 'GGG' 
b = 'CCC' 
try: 
    a = fasta1[int(l1)] 
    b = fasta2[int(l2)] 
except IndexError: 
    pass 
Verwandte Themen