计算包含文件中存在的每个子字符串的行

时间:2018-06-14 03:16:05

标签: python python-3.x

所以我编写了这段代码,用于在字符串中查找子字符串(长度 k )。我希望它能检查466个字符串(来自通过 pc 打开的文件),如果存在子字符串,则将1添加到子字符串字典{{1因此,基本上计算一个子串出现的序列数。显然它不起作用:

proteinCDict

当k = 7时,通过特定情况说明我面临的问题,具有最高出现频率的子串低于当k = 8时的子串。这不应该是这种情况,因为k = 8中频率最高的子串可以分成两个长度为7的子串。那么我哪里出错?

编辑:每个替代行都是一个空格,因此我拨打import operator proteinCDict = {} for i in range(0, 466): record = [] pc.readline() sequence = pc.readline() for j in range(0, len(sequence)-k): if((sequence[j:j+k] in proteinCDict) and\ (sequence[j:j+k] not in record)): record.append(sequence[j:j+k]) proteinCDict[sequence[j:j+k]] += 1 else: record.append(sequence[j:j+k]) proteinCDict[sequence[j:j+k]] = 1 proteinCDict = sorted(proteinCDict.items(), key=operator.itemgetter(1)) print(proteinCDict) 2次。

2 个答案:

答案 0 :(得分:3)

首先,对您的代码进行一些评论:

  • 我看到的主要问题是,通过循环range(0, len(sequence)-k),您正在跳过子序列sequence[len(sequence)-k:]

  • 如果您要打开文件,则应使用with声明。

  • 您可以直接遍历文件对象以获取其行,而不是使用range

  • 对于与计数相关的任何事情,collections.Counter可能更适合。

  • 为了跟踪在一行上看到的子序列,setlist更适合数据结构,因为它允许持续时间查找。

以下解决方案使用Counter,然后您可以使用Counter.most_common按出现次数对子序列进行排序。

代码

import collections

def count_in_file(filename, k):
    counter = collections.Counter()

    with open(filename, 'r') as f:
        for line in f:
            line = line.strip()

            line_sequences = set(line[i:i+k] for i in range(len(line) + 1 - k))

            for seq in line_sequences:
                counter[seq] += 1

    return counter

counter = count_in_file('test_file.txt', 3)

print(counter.most_common())

测试文件

ABCABC

BCA

输出

[('BCA', 2), ('CAB', 1), ('ABC', 1)]

答案 1 :(得分:1)

暂时查看逻辑,

你应该做j:j+k-1之类的事情 因为j的第一个位置始终为0。

我建议为新的结束位置设置变量,例如endpos = j+k-1,然后使用

此外,如果您寻找的子字符串位于proteinCDict,则不应再追加它。你只需要像你所做的那样去寻找它。