2017-09-13 1 views
4

Wenn ich das Programm starte, wird immer True ausgegeben. Zum Beispiel, wenn ich AAJJ eingeben, wird True gedruckt, weil nur überprüft wird, ob der erste Buchstabe wahr ist. kann mir jemand in die richtige richtung zeigen? Vielen Dank!Wie können Sie nach bestimmten Zeichen in einer Zeichenfolge suchen?

squence_str = raw_input("Enter either A DNA, Protein or RNA sequence:") 

def DnaCheck(): 

    for i in (squence_str): 
     if string.upper(i) =="A": 
      return True 
     elif string.upper(i) == "T": 
      return True 
     elif string.upper(i) == "C": 
      return True 
     elif string.upper(i) == "G": 
      return True 
     else: 
      return False 

print "DNA ", DnaCheck() 
+0

Es passiert, weil Sie nach dem Überprüfen des ersten Buchstabens 'true' oder' false' zurückgeben und Ihre Funktion nur dort endet und nicht nach dem nächsten Buchstaben sucht. Passen Sie Ihren Code Ihren Bedürfnissen an und geben Sie ihn nicht in jeder Anweisung zurück. Verwenden Sie stattdessen eine Flagge, um zu überprüfen. – VatsalSura

Antwort

7

Sie müssen prüfen, ob alle der Basen in der DNA-Sequenz gültig sind.

def DnaCheck(sequence): 
    return all(base.upper() in ('A', 'C', 'T', 'G') for base in sequence) 
0

Mehr auf der Ebene des aktuellen Lern ​​...

Sie haben die Logik umgekehrt. Sie müssen alle die Positionen überprüfen. Wenn eine von ihnen fehlschlägt, als ein Nukleotid in "ACTG" zu identifizieren, dann geben Sie sofort False für die Zeichenfolge zurück. Nur wenn Sie alle der Zeichen überschritten haben, können Sie vertrauenswürdig True zurückgeben.

import string 

def DnaCheck(squence_str): 

    for i in (squence_str): 
     if string.upper(i) not in "ACTG": 
      return False 

    return True 

test_cases = ["", "AAJJ", "ACTG", "AACTGTCAA", "AACTGTCAX"] 
for strand in test_cases: 
    print strand, DnaCheck(strand) 

Ausgang:

True 
AAJJ False 
ACTG True 
AACTGTCAA True 
AACTGTCAX False 
+0

Wenn Sie 'all' verwenden, wird bei einem Fehler sofort ein Kurzschluss verursacht. Nicht sicher, wie pythonisch die 'for'-Schleife hier ist. Es sei denn, Sie sagen dann weiter, dass der pythonische Weg, um diese For-Schleife zu erreichen, "all" ist. – Alexander

+0

Ich vermute, dass ** all ** etwa zwei Schritte über OPs aktuellen akademischen Komfort hinausgeht. Diese ** für ** Schleife endet auch beim ersten Fehler. ** all ** ist sicherlich mehr Pythonic, aber diese Lösung hat eine bessere Chance, den Fehler im geposteten Code zu veranschaulichen. – Prune

2

Ich mag @ Alexander Antwort, aber für Vielfalt sehen Sie könnten, wenn

def dna_check(sequence): 
    return set(sequence.upper()).issubset("ACGT") 
    # another possibility: 
    # return set(sequence).issubset("ACGTacgt") 

auf langen Sequenzen schneller sein könnte, vor allem, wenn die Chancen eines Wesens legale Reihenfolge sind gut (dh die meiste Zeit müssen Sie sowieso über die ganze Sequenz iterieren).

+0

Für längere Sequenzen könnte dies von Vorteil sein. Der beabsichtigte Anwendungsfall ist hier jedoch eine manuell eingegebene Zeichenfolge, so dass sie wahrscheinlich relativ kurz ist. – Alexander

+1

(Achselzucken) Wenn Sie auf Benutzereingaben warten, wird jede plausible Funktion im Vergleich unglaublich schneller sein. Ich dachte eher an "wenn Sie mit der Verarbeitung von 20MB Eingabedateien beginnen". –

Verwandte Themen