在Python中关闭能够分析可变长度字符串的读取窗口的干净方法?

2024-05-29 08:20:29 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

Tags: 字符串程序count结尾序列window字符print
3条回答

您只需要将while循环的条件更改为基于len(str_exp),它将检测字符串的长度。我让你自己算算,因为你已经掌握了所有的基本知识

可以使用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个字符,而不是,比方说,用一个segfault崩溃。)因此,最好考虑一种重写代码的方法,这样您就不需要它了

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

请执行以下操作:

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

范围只是创建一个数字列表。通过使最后一个数字成为str_exp中的最后一个索引,并通过创建窗口的开头和结尾,您可以确保永远不会从结尾处跑掉

range表达式导入python shell以查看它的功能

相关问题 更多 >

    热门问题