#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())