关闭一个能够在Python中分析可变长度字符串的阅读窗口的简洁方法?

时间:2012-12-03 19:49:28

标签: python frame sequence

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

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

3 个答案:

答案 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中以查看它的作用。