0

我正在尝试创建一个可以分析字符串序列的程序。目前,我的程序能够逐个字符地检查序列,但我不知道如何干净地让它识别字符串的结尾,这将是可变的。

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
4

3 回答 3

1

您只需将while循环中的条件更改为基于len(str_exp),这将检测字符串的长度。我会留给你来计算算术,因为你已经掌握了所有的基本部分

于 2012-12-03T19:58:55.270 回答
0

您可以使用len(s). 因此,一种方法是替换这一行:

while n<=10:

有了这个:

while n<=len(str_exp) - 5:

但是,您通常不想要n = 0 … while n<=bound: … n+=1Python 中的循环。最好用 just 替换所有三行for n in range(bound):range(5)只是意味着[0, 1, 2, 3, 4], 并且意味着“用, 然后用, ..., 然后用for n in [0, 1, 2, 3, 4]:” 运行这个循环,这正是它的意思。所以:n=0n=1n=4n = 0 … while n<=4: … n+=1

for n in range(len(str_exp)-5):

但是,无论哪种方式,很容易搞砸并得到一个错误的错误,您要么错过最后一个窗口,要么走得太远并通过它。(幸运的是,在 Python 中,这意味着您只需打印一个只有 4 个字符而不是 5 个字符的窗口,而不是说,由于段错误而崩溃。)因此,通常最好想办法重写您的代码,这样您不需要那个。

有时,向后思考比向前思考更容易。需要花点时间来确定我想从0to转到len(str_exp) - 5……但是如果我向后定义切片,对我来说很明显我可以从5to 转到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 上找到的模块中),您可以使用它。

于 2012-12-03T19:58:02.773 回答
0

做这个:

windowlen = 5
for end in range(windowlen,len(str_exp)):
    print str_exp[end-windowlen:end]

Range 只是创建一个数字列表。通过让最后一个数字成为 中的最后一个索引str_exp,并通过参考结尾创建窗口的开头,您可以确保您永远不会跑到结尾。

range表达式放入您的 python shell 以查看它的作用。

于 2012-12-03T19:58:39.193 回答