计数最大kmer重复频率

2024-06-25 06:56:31 发布

您现在位置:Python中文网/ 问答频道 /正文

如果n是3,那么序列“atatag”包含4x“ATA”、3x“TAT”和1x“TAG”。因此,比例为4/8=0.5。这个数字越高,序列的重复性就越强。在

编写函数^ {CD1>},其中{{CD2}}是一个序列,^ {< CD3>}是K-MeR考虑的长度。函数应该返回上面描述的比例。在

有人能帮我做这个吗?在


Tags: 函数tag序列数字比例mercd1重复性
3条回答

这看起来像作业,但至少是脑筋急转弯的那种。在

提示:itertoolsgenerators、和{}对于此类问题非常方便。在

import itertools
import collections

ACIDS = ('A', 'C', 'T', 'G')


def walk_seq(s, chunk_size):
    assert len(s) >= chunk_size
    for i in range(0, len(s) - chunk_size + 1):
        yield s[i:i+chunk_size]


def simple(s, n):
    snip_counts = collections.defaultdict(int)
    for chunk in walk_seq(s, n):
        for snip_tuple in itertools.product(ACIDS, repeat=n):
            snip = ''.join(snip_tuple)
            if chunk == snip:
                snip_counts[snip] += 1
    total_matches = sum(snip_counts.values())
    maxi = max(snip_counts.values())
    return float(maxi) / total_matches

print simple('ATATATATAG', 3)

这是一个非常好的算法问题,你自己也可以试试,但这里有一个几乎没有挑战性的解决方案。在

s = "ATATATATAG"
n = 3

def simple(s,n):
    dictionary = {}
    total = 0
    for i in range (len(s)-(n-1)): # (n-1) to get last element
        k = i+n
        if s[i:k] in dictionary:
            dictionary[s[i:k]] += 1
        else:
            dictionary.update({s[i:k]:1})
        total += 1 # doing it here to avoid sum(dictionary.values())

    for key, value in dictionary.items():
        dictionary[key] = value/total
    # As a challenge, edit the line above to lambda function
    print(dictionary)

simple(s,n)

# sample output
#{'TAT': 0.375, 'ATA': 0.5, 'TAG': 0.125}
from nltk import ngrams
from collections import Counter


def simple(seq, n):
    return Counter(ngrams(seq, n)).most_common(1)[0][1] / float(len(seq) - n + 1)

相关问题 更多 >