2016-10-02 3 views
0

Ich versuche, eine Zeichenfolge (ohne Leerzeichen) zu lesen, ziehen Sie Instanzen aus, wo ein einzelner Kleinbuchstabe auf beiden Seiten von 3 Großbuchstaben (d. H. HHSkSIO) umgeben ist.Verwenden einer verschachtelten if-Anweisung innerhalb einer for-Schleife

def window(fseq, window_size=7): 
    for i in xrange(len(fseq) - window_size + 1): 
     yield fseq[i:i+window_size] 


for seq in window('asjdjdfkjdhfkdjhsdfkjsdHJJnJSSsdjkdsad', 7): 
    if seq[0].isupper and seq[1].isupper and seq[2].isupper and seq[3].islower and seq[4].isupper and seq[5].isupper and seq[6].isupper: 
      print seq 

, wo das erste Funktionsfenster mir durch die Zeichenfolge mit einem Schiebefenster von 7 und den zweiten Teil iterieren ermöglicht, die für Anweisung, überprüft, ob die Zeichen in jedem Fenster sind: Ich habe den Code unten geschrieben höher höher höher niedriger höher höher höher höher. Wenn ich den Code ausführen, kommt es aus mit:

asjdjdf 
sjdjdfk 
jdjdfkj 
djdfkjd 
jdfkjdh 
dfkjdhf 
fkjdhfk 
kjdhfkd 
jdhfkdj 
dhfkdjh 
hfkdjhs 
fkdjhsd 
kdjhsdf 
djhsdfk 
jhsdfkj 
hsdfkjs 
sdfkjsd 
dfkjsdH 
fkjsdHJ 
kjsdHJJ 
jsdHJJn 
sdHJJnJ 
dHJJnJs 
HJJnJsd 
JJnJsdj 
JnJsdjk 
nJsdjkd 
Jsdjkds 
sdjkdsa 
djkdsad 

Wie kann ich die für Anweisung nur Ausdruck des Schiebefenster, die if-Anweisung zu dem oben entspricht machen, anstatt sie alle auszudrucken? P. Ich weiß, das ist wahrscheinlich eine sehr kluge Art, es zu tun, ich bin ein Anfänger und es war das einzige, was ich mir vorstellen konnte!

+0

'f [0] .isupper' und der Rest nicht wirklich die Funktionen aufrufen. Ein Methodenobjekt ist "truthy", daher ist Ihre Bedingung immer "True". Sie können sich auch ein paar Probleme ersparen und die Tatsache nutzen, dass 'str.isupper'' True' zurückgibt, wenn alle umschlossenen Zeichen in einer Zeichenkette höher sind. –

+0

ah OK, also brauche ich: wenn seq [0] == True? – sahwahn

+0

Nein, Sie müssen die Methoden aufrufen, zum Beispiel 'seq [: 3] .isupper()' würde testen, ob die 2 ersten Zeichen Groß- und Kleinbuchstaben sind. Im Allgemeinen tust du nie etwas in Python. Testen Sie einfach nach etwas. –

Antwort

1

Sie haben die isupper und islower Methoden aufrufen:

if seq[:3].isupper() and seq[3].islower() and seq[4:].isupper(): 
     print seq 
1

Das Problem ist, dass Sie die() in Ihre Anrufe fehlen, .isupper, die immer auf true zu bewerten.

Versuchen:

def window(fseq, window_size=7): 
    for i in range(len(fseq) - window_size + 1): 
     yield fseq[i:i+window_size] 


for seq in window('asjdjdfkjdhfkdjhsdfkjsdHJJnJSSsdjkdsad', 7): 
    if seq[0].isupper() and seq[1].isupper() and seq[2].isupper() and seq[3].islower() and seq[4].isupper() and seq[5].isupper() and seq[6].isupper(): 
     print (seq) 

Der andere Weg, es zu tun, wäre:

import re 
s = re.compile(r'[A-Z]{3}[a-z][A-Z]{3}') 
def window(fseq, window_size=7): 
    for i in range(len(fseq) - window_size + 1): 
     yield fseq[i:i+window_size] 

for seq in window('asjdjdfkjdhfkdjhsdfkjsdHJJnJSSsdjkdsad', 7): 
    result = s.search(seq) 
    if result is not None: 
     print(result.group()) 
+0

toll funktioniert das, danke! – sahwahn

+0

Gern geschehen. – Nf4r

Verwandte Themen