использование вложенного оператора if в цикле for

#python #string #iteration

#python #строка #итерация

Вопрос:

я пытаюсь прочитать строку (без пробелов), извлекая экземпляры, в которых есть одна строчная буква, окруженная с обеих сторон 3 прописными буквами (т. Е. HHSkSIO). Я написал приведенный ниже код:

 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 я знаю, что это, вероятно, очень неуклюжий способ сделать это, я новичок, и это было единственное, что я мог придумать!

Комментарии:

1. seq[0].isupper а остальные фактически не вызывают функции. Объект метода является «правдивым», следовательно, ваше условие всегда True . Вы также можете избавить себя от некоторых проблем и использовать тот факт, что str.isupper возвращает True значение, если все символы в строке в регистре являются верхними.

2. ах, хорошо, итак, мне нужно: if seq[0] == True ?

3. Нет, вам нужно вызвать методы, например seq[:3].isupper() , проверить, являются ли 2 первых символа символами в регистре и прописными. В общем, вы никогда не делаете something == True в python. Просто проверьте something .

Ответ №1:

Вы должны вызвать методы isupper and islower :

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

Ответ №2:

Проблема в том, что вам не хватает () в ваших вызовах .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())