查找字符串中特定字符的范围

时间:2014-07-19 11:53:24

标签: python python-3.x

我正在使用Windows 7上的python-3.x.我有一个由数百万个字符组成的字符串。考虑例如:

ATCGNNNATCGATNNNNNATCGANTCG

我希望获得N的范围。在这里,[[4,7], [13,18], [23,24]]。 我不能只取N s的位置,然后将它们转换为范围,因为它是一个巨大的数据,这个方法太慢了。 这似乎是一个很容易解决的问题,但实际上并没有好的办法。 有没有快速的方法来做到这一点?

2 个答案:

答案 0 :(得分:10)

不确定这是如何扩展为数百万字符的字符串,但您可以尝试regular expressions

>>> import re
>>> data = "ATCGNNNATCGATNNNNNATCGANTCG"
>>> spans = (g.span() for g in re.finditer('N+', data))
>>> list(spans)
[(4, 7), (13, 18), (23, 24)]

更新:使用随机生成的A,C,G,T和N字符串进行尝试。对于1,000,000个字符,list(spans)只需不到一秒钟,而10,000,000个字符需要在我不知道的新电脑上大约10秒钟,找到大约1,600,000组N.

答案 1 :(得分:2)

没有re的解决方案:

from itertools import chain

def find_ranges(it, elem):
    start = None
    for i, e in enumerate(chain(it, [None])):
        if not start and e == elem:
            start = i
        elif start and e != elem:
            yield (start, i)
            start = None

使用ipython的魔法%timeit进行测量:

In [1]: import random
In [2]: s = [random.choice("ACGTN") for i in range(1000000)]
In [3]: %timeit list(find_ranges(s, "N"))
10 loops, best of 3: 164 ms per loop

编辑:添加一个带链的守卫,以便在序列中的最后一项是搜索元素时使其工作。