如何使用Python获取字符串的多个最频繁的kmer?

2024-09-20 05:43:55 发布

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

如果我插入以下内容:

Insert the Text:
ACACACA
Insert a value for k:
2

对于以下代码

print("Insert the Text:")
Text = input()
print("Insert a value for k:")
k = int(input())
Pattern = " "
count = [ ]
FrequentPatterns = [ ]

def FrequentWords(Text, k):
    for i in range (len(Text)-k+1):
        Pattern = Text[i: i+k]
        c = 0
        for i in range (len(Text)-len(Pattern)+1):   
            if Text[i: i+len(Pattern)] == Pattern:
                c = c+1
            else: 
                continue
        count.extend([c])
    print(count)
    if count[i] == max(count):   
        FrequentPatterns.extend([Pattern])
    return  FrequentPatterns

FrequentWords(Text, k)

我把下面的东西拿出来

Insert the Text:
ACACACA
Insert a value for k:
2
[3, 3, 3, 3, 3, 3]
['CA']

显然有两个FrequentPatterns。所以最后一个列表输出应该是['AC', 'CA'] 我不知道为什么这个代码不起作用。如果有人能帮忙,我真的很感激


Tags: the代码textinforinputlenvalue
1条回答
网友
1楼 · 发布于 2024-09-20 05:43:55

下面是解决这个问题的方法:

from itertools import groupby

def find_kgrams(string, k):
    kgrams = sorted(
        string[j:j+k]
            for i in range(k)
                for j in range(i, (len(string) - i) // k * k, k)
    )
    groups = [(k, len(list(g))) for k, g in groupby(kgrams)]
    return sorted(groups, key=lambda i: i[1], reverse=True)

其工作方式是:

  • 它生成给定长度k的字符串块,例如:
    • 从0开始:“ACACACA”->;'“AC”、“AC”、“AC”
    • 从1开始:“ACACACA”->;'“CA”,“CA”,“CA”
    • …最多k - 1(1是k == 2的最大值)
  • groupby()将这些块分组
  • sorted()按计数对它们进行排序
  • 返回KGRAM的元组列表及其计数

测试:

s = 'ACACACA'
kgrams = find_kgrams(s, 2)
print(kgrams)

印刷品:

[('AC', 3), ('CA', 3)]

它已经排序,您可以从返回列表的前面选择最频繁的一个:

max_kgrams = [k for k, s in kgrams if s == kgrams[1][1])
print(max_kgrams)

印刷品:

['AC', 'CA']

相关问题 更多 >