在for循环中使用嵌套的if语句
问题描述:
我试图通过一个字符串(不带空格)读取实例,其中包含两个由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我知道这可能是一个非常笨重的做法,我是一个初学者,而且这是我能想到的唯一的事情!
答
你必须调用isupper
和islower
方法:
if seq[:3].isupper() and seq[3].islower() and seq[4:].isupper():
print seq
答
的问题是,你错过了()在调用.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] .isupper',其余不实际调用的函数。方法对象是“真理”,因此你的条件总是“真”。如果字符串中的所有字符都是较大的,你也可以省去一些麻烦,并使用'str.isupper'返回'True'的事实。 –
啊好的,所以我需要:如果seq [0] == True? – sahwahn
不,您需要调用方法,例如'seq [:3] .isupper()'会测试2个第一个字符是否为大写字母。一般来说,你绝对不会在Python中执行'something == True'。只要测试一下'something'。 –