我正在尝试创建一个可以分析字符串序列的程序。目前,我的程序能够按字符检查序列,但我不知道如何干净地识别字符串的结尾,这将是可变的。
str_exp="ABCDAABKLYWAKAT"
n=0
x=5
while n<=10:
window=str_exp[n:x]
print window,
n+=1
x+=1
countA=window.count('A')
print countA
这应输出:
ABCDA 2
BCDAA 2
CDAAB 2
DAABK 2
AABKL 2
ABKLY 1
BKLYW 0
KLYWA 1
LYWAK 1
YWAKA 2
WAKAT 2
答案 0 :(得分:1)
您只需要将while
循环上的条件更改为基于len(str_exp)
,这将检测字符串的长度。我会把它留给你来弄清算法,因为你已经得到了所有基本的部分
答案 1 :(得分:0)
您可以使用len(s)
获取字符串(或许多其他Python类型)的长度。所以,一种方法是替换这一行:
while n<=10:
用这个:
while n<=len(str_exp) - 5:
但是,您通常不希望在Python中使用n = 0 … while n<=bound: … n+=1
之类的循环;最好用for n in range(bound):
替换所有三行。 range(5)
仅表示[0, 1, 2, 3, 4]
,for n in [0, 1, 2, 3, 4]:
表示“使用n=0
运行此循环,然后使用n=1
,...,然后使用n=4
”,这正是n = 0 … while n<=4: … n+=1
的含义。所以:
for n in range(len(str_exp)-5):
然而,无论哪种方式,都很容易搞砸了并且得到一个一个一个错误,你要么错过了最后一个窗口,要么走得太远并且通过它。 (幸运的是,在Python中,这意味着你只需要打印一个只有4个字符而不是5个字符的窗口,而不是像使用段错误一样崩溃。)因此,考虑重写代码的方法通常会更好不需要那个。
有时候,向前思考比向前思考更容易。需要花一点时间才能确保我想要从0
转到len(str_exp) - 5
...但如果我向后定义切片,我很明显可以从5
开始到len(str_exp)
。如果你也是这样,你可以像这样重写它:
for n in range(5, len(str_exp)):
window=str_exp[n-5:n]
…
或者,如果两者都不明显,您可以用不同的方式定义事物。例如,如果你想要直到窗口不再是5个字符:
for n in range(len(str_exp)):
window=str_exp[n:x]
if len(window) < 5:
break
…
还有更激进的方式来重新思考这一点。举个例子,你可以编写一个通用的window
函数,然后你的循环看起来像这样:
for window in iterwindow(str_exp, 5):
…
您可能无法编写或甚至阅读此iterwindow
函数。它看起来像这样:
def window(iterable, windowlength):
window = ''
for i in iter(iterable):
if len(window) == windowlength:
window = window[1:]
window = window + i
if len(window) == windowlength:
yield window
但如果其他人写了它(在标准库中,或者你可以在PyPI上找到的模块),你可以使用它。
答案 2 :(得分:0)
这样做:
windowlen = 5
for end in range(windowlen,len(str_exp)):
print str_exp[end-windowlen:end]
范围只会创建一个数字列表。通过将最后一个数字作为str_exp
中的最后一个索引,并通过参考结尾创建窗口的开始,您可以确保永远不会跑到最后。
将range
表达式放入python shell中以查看它的作用。