gpt4 book ai didi

python - 计算文件中包含每个子字符串的行数

转载 作者:行者123 更新时间:2023-11-28 22:18:01 25 4
gpt4 key购买 nike

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

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)

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

编辑:每一行都是一个空格,因此我调用了 readline() 2 次。

最佳答案

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

  • 我看到的主要问题是,通过遍历 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)]

关于python - 计算文件中包含每个子字符串的行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50849090/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com