2016-10-02 149 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