Python中的常用词
如何编写代码来查找“gatccatac”中最常见的2-mer。 我写了这段代码,但似乎我错了,请帮助纠正我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 这段代码打印字符串中最
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-merAA
是重复2次还是3次?i、 它们可以重叠吗?这里不需要tee
。这将使所需的中间存储加倍——然而,字符串可以多次迭代,因此您可以只执行a,b=iter(dna),iter(dna)
。我在理解上述代码时遇到问题。请详细说明,因为我不知道a,b,c和uu代表什么。但是如果我们将代码编辑为a,b=iter(dna),iter(dna),它仍然给出相同的结果。@shahzadfidaa
和b
不代表任何东西,它们只是变量名c
代表计数器
。正如@mgilson所指出的,如果保证以字符串形式输入,那么这是一个过于复杂的解决方案。如果您的输入可以来自另一个迭代器(如生成器),则此解决方案不依赖于索引和切片,而某些类型不依赖于索引和切片support@shahzadfidaCounter
是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会话并导入更多工具。您可能需要重新启动会话。