2016-10-02 177 views
0

我試圖通過一個字符串(不帶空格)讀取實例,其中包含兩個由3個大寫字母(即HHSkSIO)包圍的單個小寫字母。我已經寫了下面的代碼:在for循環中使用嵌套的if語句

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 

,其中第一功能窗口允許我使用的7滑動窗和第二部分,for語句,檢查每個窗口內的字符是否通過串迭代更高更高更低更高更高更高。當我運行的代碼,它出來有:

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 

我怎樣才能讓for語句打印出一個符合上面的滑動窗口if語句,而不是打印出所有的人? P.S我知道這可能是一個非常笨重的做法,我是一個初學者,而且這是我能想到的唯一的事情!

+0

'序列[0] .isupper',其餘不實際調用的函數。方法對象是「真理」,因此你的條件總是「真」。如果字符串中的所有字符都是較大的,你也可以省去一些麻煩,並使用'str.isupper'返回'True'的事實。 –

+0

啊好的,所以我需要:如果seq [0] == True? – sahwahn

+0

不,您需要調用方法,例如'seq [:3] .isupper()'會測試2個第一個字符是否爲大寫字母。一般來說,你絕對不會在Python中執行'something == True'。只要測試一下'something'。 –

回答

1

你必須調用isupperislower方法:

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

的問題是,你錯過了()在調用.isupper,它始終爲true。

嘗試:

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) 

做的另一種方式,應該是:

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

偉大的作品,謝謝! – sahwahn

+0

不客氣。 – Nf4r