Python中经常使用的单词

时间:2016-12-14 15:34:45

标签: python bioinformatics string-matching

如何编写代码以找到最常见的2-mer" GATCCAGATCCCCATAC"。 我写了这段代码,但似乎我错了,请帮助纠正我。

An unhandled exception of type 'System.InvalidOperationException' occurred in System.Windows.Forms.dll

Additional information: Cross-thread operation not valid: Control 'Dlg_CardRead' accessed from a thread other than the thread it was created on.

此代码在字符串中打印最常用的k-mer,但它不会给我 给定字符串中的2-mer。

3 个答案:

答案 0 :(得分:5)

您可以先定义一个函数来获取字符串中的所有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)]

然后你可以使用collections.Counter来计算每个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

答案 1 :(得分:2)

一般来说,当我想用​​python计算内容时,我使用Counter

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最常见的2-mers列表,其中包含字符串中的计数。

事实上,我们可以将其概括为找到给定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)

答案 2 :(得分:2)

如果您想要一种简单的方法,请考虑使用sliding window技术。 more_itertools中提供了一项实施方案,因此您无需自己制作。如果您pip install more_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})

上面的示例演示了使用windowedCounter获取大部分所需信息所需的一切。

<强>描述

A&#34;窗口&#34;或者长度为k=2的容器一次一步跨越序列(例如step=1)。每个新组都被添加为Counter字典的键。对于每次出现,计数都会递增。最终的Counter对象主要报告所有结果,并包含其他helpful features

最终解决方案

如果实际的字符串对很重要,那也很简单。我们将创建一个将字符串分组并适用于任何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})