Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.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 Itertools停止字符在一行中重复_Python_Itertools - Fatal编程技术网

Python Itertools停止字符在一行中重复

Python Itertools停止字符在一行中重复,python,itertools,Python,Itertools,我编写了以下代码,以使所有长度为20个字符的字符串具有A、T、G和C的组合 但是,我希望避免一行中的相同字符超过3个,因此我添加了一个if函数来检查这一点。问题是,这是在itertools代码之后,所以有点慢。我想知道是否有一种方法可以使用itertools生成这个结果,而不必运行itertools和if函数 import sys import itertools import re x = ["A","T","G","C"] for i in itertools.product(x, rep

我编写了以下代码,以使所有长度为20个字符的字符串具有A、T、G和C的组合

但是,我希望避免一行中的相同字符超过3个,因此我添加了一个if函数来检查这一点。问题是,这是在itertools代码之后,所以有点慢。我想知道是否有一种方法可以使用itertools生成这个结果,而不必运行itertools和if函数

import sys
import itertools
import re

x = ["A","T","G","C"]
for i in itertools.product(x, repeat=20):
        i = "".join(i)
        if re.search(r"(\w)\1\1",i):
                continue
        else:
                sys.stdout.write(i)

从表面上看,问题似乎是这样的:

我如何才能过滤这个庞大的字符串列表,而不必首先构建整个列表

答案是:你已经在做了!
itertools
中的内容会生成以迭代方式构造的延迟生成序列。因此,您现有的代码不会生成一个包含数十亿字符串的庞大列表

但你可能想问一个更有趣的问题:

如果我通过生成所有字符串并过滤掉其中包含三元组的字符串来生成无三元组的字符串,那么我的代码必须做额外的工作,因为生成的大多数字符串中都包含三元组。假设字符串是按字典顺序生成的;然后第一个4**17将开始AAA,我们真的应该能够跳过所有这些。我们怎样才能做得更好

不幸的是,如果您想这样做,那么您必须编写自己的代码来完成它
itertools
不提供这种“模式过滤产品”功能

它可能看起来像这样:

# generate all n-tuples with the property that their k-th element
# is one of the things returned by successors(initial (k-1)-tuple).
# So e.g. the first element is one of the things returned by
# successors(()).
def restricted_tuples(successors, n):
    assert(n>=0)
    if n==0:
        for t in successors(()): yield (t,)
    else:
        for start in restricted_tuples(successors, n-1):
            for t in successors(start): yield start+(t,)

def successors_no_triples(start, alphabet):
    if len(start)<2 or start[-1] != start[-2]:
        for t in alphabet: yield t
    else:
        banned = start[-1]
        for t in alphabet:
            if t != banned: yield t

print([''.join(x) for x in restricted_tuples(lambda start: successors_no_triples(start,'ABC'), 5)])
#生成具有其第k个元素的属性的所有n元组
#是继承者返回的内容之一(初始(k-1)-元组)。
#例如,第一个元素是
#继承人(())。
def受限_元组(后继,n):
断言(n>=0)
如果n==0:
对于后继的t(()):收益率(t,)
其他:
对于受限元组中的起始(后继,n-1):
对于后继的t(开始):产量开始+(t,)
def接班人编号三元组(开始,字母表):

如果len(start)
置换
没有
重复
关键字参数。你确定这是你的代码吗?另外,您所说的避免一行中的相同字符超过3个是什么意思?我很确定它的目的是
product
,它接受一个
repeat
参数,而不像
置换
那样,它做了jonc希望它做的事情。您是否尝试过numpy choice对列表进行随机采样:通过这种方式,您可以准确地指定您想要的数量。jonc,从没有相同三元组的ATGC中提取的20个字符串的数量大于没有相同二元组的数量,即4(对于第一个字符)乘以3**19(对于其余字符)或大约46亿。(实际数字要大得多,但我懒得精确计算。)将它们全部写入标准输出需要很长时间。你实际上打算做什么?即使你有一个非常快速的方法来检查每个字符串,你也在迭代4^20>1万亿个字符串。这要花很长时间哦,你说得对。我将编辑它以使用更好的名称。。。。完成。对不起,谢谢。我稍微修改了一下,这样它可以动态打印,现在我应该得到一些可用的字符串(希望其中一个或多个与我将搜索它们的基因组不匹配(包括长字符串A、T、G、C)。