Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.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_Bioinformatics_String Matching - Fatal编程技术网

Python中的常用词

Python中的常用词,python,bioinformatics,string-matching,Python,Bioinformatics,String Matching,如何编写代码来查找“gatccatac”中最常见的2-mer。 我写了这段代码,但似乎我错了,请帮助纠正我 def PatternCount(Pattern, Text): count = 0 for i in range(len(Text)-len(Pattern)+1): if Text[i:i+len(Pattern)] == Pattern: count = count+1 return count 这段代码打印字符串中最

如何编写代码来查找“gatccatac”中最常见的2-mer。 我写了这段代码,但似乎我错了,请帮助纠正我

def PatternCount(Pattern, Text):
    count = 0
    for i in range(len(Text)-len(Pattern)+1):
        if Text[i:i+len(Pattern)] == Pattern:
            count = count+1
    return count
这段代码打印字符串中最频繁的k-mer,但它没有给出
给定字符串中的2-mer。

通常,当我想用python计数时,我使用
计数器

from itertools import tee
from collections import Counter

dna = "GATCCAGATCCCCATAC"
a, b = tee(iter(dna), 2)
_ = next(b)
c = Counter(''.join(l) for l in zip(a,b))
print(c.most_common(1))
这将打印
[('CC',4)]
,一个元组中最常见的
1
的列表,其计数在字符串中

事实上,我们可以将其推广到为给定的
n
找到最常见的n-mer

from itertools import tee, islice
from collections import Counter

def nmer(dna, n):
    iters = tee(iter(dna), n)
    iters = [islice(it, i, None) for i, it in enumerate(iters)]
    c = Counter(''.join(l) for l in zip(*iters))
    return c.most_common(1)

您可以首先定义一个函数来获取字符串中的所有k-mer:

def get_all_k_mer(string, k=1):
   length = len(string)
   return [string[i: i+ k] for i in xrange(length-k+1)]
然后,您可以使用
集合。计数器
计算每个k-mer的重复次数:

>>> from collections import Counter
>>> s = 'GATCCAGATCCCCATAC'
>>> Counter(get_all_k_mer(s, k=2))
输出:

Counter({'AC': 1,
         'AG': 1,
         'AT': 3,
         'CA': 2,
         'CC': 4,
         'GA': 2,
         'TA': 1,
         'TC': 2})
另一个例子:

>>> s = "AAAAAA"
>>> Counter(get_all_k_mer(s, k=3))
输出:

Counter({'AAA': 4})
# Indeed : AAAAAA
           ^^^     -> 1st time
            ^^^    -> 2nd time
             ^^^   -> 3rd time
               ^^^ -> 4th time

如果你想要一个简单的方法,考虑一个技巧。中提供了一个实现,因此您不必自己制作一个。如果您

pip安装了更多的itertools
,这很容易使用

简单示例

>>> from collections import Counter
>>> import more_itertools

>>> s = "GATCCAGATCCCCATAC"
>>> Counter(more_itertools.windowed(s, 2))
Counter({('A', 'C'): 1,
         ('A', 'G'): 1,
         ('A', 'T'): 3,
         ('C', 'A'): 2,
         ('C', 'C'): 4,
         ('G', 'A'): 2,
         ('T', 'A'): 1,
         ('T', 'C'): 2})
上面的示例演示了使用
窗口
计数器
获取所需的大部分信息所需的工作量

说明

长度为
k=2
的“窗口”或容器在序列上一次滑动一步(例如
step=1
)。每个新组都作为
计数器
字典的键添加。每次发生时,计数都会递增。最终的
计数器
对象主要报告所有计数,并包括其他计数

最终解决方案

如果实际的字符串对很重要,那也很简单。我们将创建一个通用函数,用于对字符串进行分组,并适用于任何k mers:

>>> from collections import Counter
>>> import more_itertools

>>> def count_mers(seq, k=1):
...     """Return a counter of adjacent mers."""
...     return Counter(("".join(mers) for mers in more_itertools.windowed(seq, k)))

>>> s = "GATCCAGATCCCCATAC"
>>> count_mers(s, k=2)
Counter({'AC': 1,
         'AG': 1,
         'AT': 3,
         'CA': 2,
         'CC': 4,
         'GA': 2,
         'TA': 1,
         'TC': 2})

请回答您的问题,并包括
模式
文本
的可能值。提示:在Python中,函数名和变量名不以大写字母开头。这些是为类名保留的。你的问题假设我们知道什么是2-mer。不幸的是,在不知道2-mer是什么的情况下,很难告诉您如何找到最频繁的2-mer。2-mer基本上是给定字符串中重复频率最高的2个单词,通常我们可以称之为k-mer。例如,“ACTAT”是Text=“acactatgcatactaggactatct”最频繁的5-mer.这是我为查找字符串中重复频率最高的单词而编写的代码,例如,在“cGatataccatag”中,最频繁的单词是“ATA”,因此这是模式,给定的字符串是文本。@shahzadfida--好的。。。如果我有字符串
AAAA
,那么2-mer
AA
是重复2次还是3次?i、 它们可以重叠吗?这里不需要
tee
。这将使所需的中间存储加倍——然而,字符串可以多次迭代,因此您可以只执行
a,b=iter(dna),iter(dna)
。我在理解上述代码时遇到问题。请详细说明,因为我不知道a,b,c和uu代表什么。但是如果我们将代码编辑为a,b=iter(dna),iter(dna),它仍然给出相同的结果。@shahzadfida
a
b
不代表任何东西,它们只是变量名
c
代表
计数器
。正如@mgilson所指出的,如果保证以字符串形式输入,那么这是一个过于复杂的解决方案。如果您的输入可以来自另一个迭代器(如生成器),则此解决方案不依赖于索引和切片,而某些类型不依赖于索引和切片support@shahzadfida
Counter
dict
的一个子类型。很抱歉出现了否决票,但我在python中更正了代码。在python 3中没有xrange,它只是范围。
range
xrange
将给出相同的结果,但它们不是相同的对象
xrange
是一种生成器,而
range
直接在内存中创建一个列表。因此,如果您有一个很长的字符串,最好使用
xrange
Pythonic。我想提到一些关于Python2中的
xrange
以及在3中用
range
解决它的问题。@MMF这太棒了。看看你是在问这些数字是从哪里来的?它们是字符串中从左到右出现的相邻字母的总和。键在任何字典中的显示方式都是无序的(Python 3.6除外)。更多itertools返回时会出现错误,如果我们只是导入itertool,它仍然不能为我们完成任务,它返回的结果是“模块itertools没有作为窗口的属性”?这是与
itertools
不同的包。在命令提示符下,您将需要
pip为最新版本安装更多的itertools
。安装完成后,转到python会话并导入更多工具。您可能需要重新启动会话。