Python读取含序列与模式的文本文件:正确的数据读取与赋值方法
序列模式匹配:正确的数据读取与赋值方式
首先,咱们先梳理下你的代码里的两个核心问题:一个是模式匹配的逻辑错误,另一个是需要根据输入文件的格式调整数据读取的方式。
一、先修正pattern_count函数的逻辑问题
原函数里的循环范围和切片写法都有错误,会导致匹配结果不准确:
- 循环范围应该是
range(len(text)-len(pattern)+1):因为最后一个可能的匹配起始位置是len(text)-len(pattern),比如文本长度13、模式长度3时,最后一个起始索引是10,所以循环范围要包含这个位置,否则会漏掉最后一次可能的匹配。 - 切片应该是
text[i:i+len(pattern)]:原代码里的text[i:len(pattern)]只会从索引i取到索引len(pattern)-1的位置,完全不符合匹配逻辑。
修正后的函数如下:
def pattern_count(text, pattern): count = 0 pattern_len = len(pattern) text_len = len(text) # 循环范围包含所有可能的起始位置 for i in range(text_len - pattern_len + 1): if text[i:i+pattern_len] == pattern: count += 1 return count
二、正确的读取数据与赋值方式
数据读取的正确写法,取决于你的输入文件格式,常见的两种场景如下:
场景1:序列和模式在同一行,用空格分隔(比如文件内容是agcdttagcdtcc agc)
你的原代码里的split()方法是可行的,但可以加一点容错处理,避免因输入格式错误导致索引越界:
import sys def pattern_count(text, pattern): count = 0 pattern_len = len(pattern) text_len = len(text) for i in range(text_len - pattern_len + 1): if text[i:i+pattern_len] == pattern: count += 1 return count # 读取并清理输入内容 input_content = sys.stdin.read().strip() data = input_content.split() # 确保输入包含至少两个数据项 if len(data) >= 2: text = data[0] pattern = data[1] print(pattern_count(text, pattern)) else: print("输入格式错误,请确保序列和模式用空格分隔在同一行")
场景2:序列在第一行,模式在第二行(比如文件第一行是agcdttagcdtcc,第二行是agc)
这种情况下,应该按行读取输入内容:
import sys def pattern_count(text, pattern): count = 0 pattern_len = len(pattern) text_len = len(text) for i in range(text_len - pattern_len + 1): if text[i:i+pattern_len] == pattern: count += 1 return count # 按行读取并过滤空行 lines = [line.strip() for line in sys.stdin if line.strip()] if len(lines) >= 2: text = lines[0] pattern = lines[1] print(pattern_count(text, pattern)) else: print("输入格式错误,请确保序列在第一行,模式在第二行")
测试示例数据
用你的示例序列agcdttagcdtcc和模式agc,正确匹配次数是2次(起始位置0和6),修正后的代码会输出正确结果。
内容的提问来源于stack exchange,提问作者Reza Afra
相关产品推荐
相关产品推荐

