Python 查找字符串中特定字符的范围
我正在Windows7上使用python-3.x。我有一个由数百万个字符组成的字符串。例如,考虑:Python 查找字符串中特定字符的范围,python,python-3.x,Python,Python 3.x,我正在Windows7上使用python-3.x。我有一个由数百万个字符组成的字符串。例如,考虑: ATCGNNNATCGATNNNNNATCGANTCG 我想得到N的范围。在这里,[[4,7],[13,18],[23,24]]。 我不能只取Ns的位置,然后将它们转换为范围,因为这是一个巨大的数据,而且这种方法速度太慢。 这似乎是一个很容易的问题,但实际上我没有想到好办法。 有没有一种快速的方法可以做到这一点?不确定这将如何扩展到数百万个字符的字符串,但您可以尝试: 更新:使用随机生成的A、C
ATCGNNNATCGATNNNNNATCGANTCG
我想得到N
的范围。在这里,[[4,7],[13,18],[23,24]]
。
我不能只取N
s的位置,然后将它们转换为范围,因为这是一个巨大的数据,而且这种方法速度太慢。
这似乎是一个很容易的问题,但实际上我没有想到好办法。
有没有一种快速的方法可以做到这一点?不确定这将如何扩展到数百万个字符的字符串,但您可以尝试:
更新:使用随机生成的A、C、G、T和N字符串尝试此操作。对于1000000个字符,
list(span)
只需不到1秒的时间,对于10000000个字符,在我这台完全不新的计算机上大约需要10秒,找到大约1600000组N。不确定如何将其扩展为数百万个字符的字符串,但你可以试试:
更新:使用随机生成的A、C、G、T和N字符串尝试此操作。对于1000000个字符,列表(跨度)
只需不到1秒的时间,对于10000000个字符,在我这台完全不是新电脑上大约需要10秒,找到大约1600000个N组。一个不需要重新设置的解决方案:
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的magic%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
编辑:在带有链的末端添加一个防护装置,以便在序列中的最后一项是搜索的元素时使其工作。无需重新搜索的解决方案:
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的magic%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
编辑:在末尾添加了一个带有链的保护,以便在序列中的最后一项是搜索的元素时使其工作。使用
g.span()
可能会稍微快一点。对于数百万个字符,我不会在理解的情况下一次使用迭代器,但除了那种伟大的方法+1之外,在不到五分钟的时间里,不需要在g.span()
整个32亿个人类基因组密码的周围进行排列!好极了感谢使用g.span()
可能会稍微快一点。对于数百万个字符,我不会在理解的情况下一次使用迭代器,但除了那种伟大的方法+1,也不需要在不到五分钟的时间内对g.span()
整个32亿人类基因组代码进行排序!好极了感谢+1的优秀图形算法。仅供比较:我在我的系统上测试了这两种解决方案,而regex方法的速度仍然是前者的两倍。看来我的电脑真的不是最快的了…谢谢。也许基于regex的解决方案更快,因为re模块是用C实现的,而我的是纯python。我相信用C实现的同样的算法比用正则表达式实现的算法要好:)+1的好图形算法。仅供比较:我在我的系统上测试了这两种解决方案,而regex方法的速度仍然是前者的两倍。看来我的电脑真的不是最快的了…谢谢。也许基于regex的解决方案更快,因为re模块是用C实现的,而我的是纯python。我相信用C实现的相同算法将胜过用正则表达式实现的算法:)