for 循环中的 Counter() 函数看起来很奇怪

Counter() function in for loop looks odd

我有一个要在测序数据中找到的序列列表。所以我 运行 一个 for 循环来查找数据集中的匹配序列,并使用 Counter() 来获取最大序列。但是我发现 Counter() 函数会添加以前的循环数据,而不是作为单独的一个。

ls = ['AGC', 'GCT', 'TAC', 'CGT']

dataset.txt 就像一堆序列 "AGTAGCTTT", "AGTTAGC"......

def xfind(seq):
    ls2 = []
    with open(dataset.txt, 'r') as f:
    for line in f:
        if seq in line:
            ls2.append(line)

    import collections
    from collections import Counter
    cnt = Counter()
    for l in ls2:
        cnt[l] += 1
    print (cnt.most_common()[0])

for l2 in ls:
    xfind(l2)

结果如下: ('AGTAGCTTT', 2) ('AGTAGCTTT", 5)

应该是: ('AGTAGCTTT', 2) ('GCT...', 3)

我不确定您是否非常了解您的代码,而且您对 Counter 的使用并不是我认为的真正用途。

首先检查文本文件每一行的子字符串是否在序列 (line) 中,如果是,则将其添加到列表中 ls2

然后,对于该列表的每个元素(即文本文件中的整个 lines/sequences),您将 1 添加到该键的计数器。你在循环中执行此操作,当 Counter 的重点是你可以简单地调用:

cnt = Counter(ls2)

这一切都意味着您正在报告文件中最常见的序列,它也包含给定的子序列。

现在,在不知道 dataset.txt 是什么样子的情况下,实际上很难说出您的确切输出应该是什么。

我先稍微整理一下代码:

from collections import Counter

subsequences = ['AGC', 'GCT', 'TAC', 'CGT']

def xfind(subseq):
    contains_ss = []
    with open("dataset.txt", 'r') as f:
       for line in f:
           if subseq in line:
               contains_ss.append(line)
    cnt = Counter(contains_ss)
    print(cnt.most_common()[0])

for ss in subsequences:
    xfind(ss)