所以我编写了这段代码,用于在字符串中查找子字符串(长度 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次。
答案 0 :(得分:3)
首先,对您的代码进行一些评论:
我看到的主要问题是,通过循环range(0, len(sequence)-k)
,您正在跳过子序列sequence[len(sequence)-k:]
。
如果您要打开文件,则应使用with
声明。
您可以直接遍历文件对象以获取其行,而不是使用range
。
对于与计数相关的任何事情,collections.Counter
可能更适合。
为了跟踪在一行上看到的子序列,set
比list
更适合数据结构,因为它允许持续时间查找。
以下解决方案使用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
,则不应再追加它。你只需要像你所做的那样去寻找它。