我正在使用Windows 7上的python-3.x.我有一个由数百万个字符组成的字符串。考虑例如:
ATCGNNNATCGATNNNNNATCGANTCG
我希望获得N
的范围。在这里,[[4,7], [13,18], [23,24]]
。
我不能只取N
s的位置,然后将它们转换为范围,因为它是一个巨大的数据,这个方法太慢了。
这似乎是一个很容易解决的问题,但实际上并没有好的办法。
有没有快速的方法来做到这一点?
答案 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
编辑:添加一个带链的守卫,以便在序列中的最后一项是搜索元素时使其工作。