Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 查找字符串中特定字符的范围_Python_Python 3.x - Fatal编程技术网

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

Python 查找字符串中特定字符的范围,python,python-3.x,Python,Python 3.x,我正在Windows7上使用python-3.x。我有一个由数百万个字符组成的字符串。例如,考虑: ATCGNNNATCGATNNNNNATCGANTCG 我想得到N的范围。在这里,[[4,7],[13,18],[23,24]]。 我不能只取Ns的位置,然后将它们转换为范围,因为这是一个巨大的数据,而且这种方法速度太慢。 这似乎是一个很容易的问题,但实际上我没有想到好办法。 有没有一种快速的方法可以做到这一点?不确定这将如何扩展到数百万个字符的字符串,但您可以尝试: 更新:使用随机生成的A、C

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

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实现的相同算法将胜过用正则表达式实现的算法:)