Python实现按空行分隔段落统计TRP/PHE/MET匹配占比
Python实现段落内目标氨基酸行占比统计
需要统计以空行分隔的每个段落中,包含TRP、PHE或MET的行数,再将匹配行数除以该段落的总行数计算占比。输入示例如下:
THR 61 65.21
LEU 62 63.85
PRO 63 54.61
LEU 64 50.74
ALA 65 57.40
PRO 66 56.49
ASP 67 56.77
PRO 68 55.94
TYR 69 56.06
PRO 70 56.55
GLY 71 57.74
HIS 72 55.69
ASN 73 64.70
PRO 74 65.70ASP 422 65.05
SER 423 53.19
SER 424 45.39
ARG 425 47.80
ALA 426 48.84
ARG 427 46.19
ALA 428 46.81
SER 429 51.64
GLY 430 56.53
GLY 431 69.14ASP 471 59.01
VAL 472 51.82
ASP 473 52.63
GLN 474 45.86
LEU 475 44.30
SER 476 45.83
LEU 477 45.78
THR 478 37.91
PRO 479 44.77
VAL 480 41.47
VAL 481 46.86
PRO 482 46.12
GLY 483 46.38
PRO 484 49.42
PRO 485 57.74
快速解决方案代码
import re # 目标氨基酸集合,查询效率更高 TARGET_AA = {'TRP', 'PHE', 'MET'} def compute_aa_ratio(input_text): # 按空行分割段落,过滤掉无内容的空段落 paragraphs = [p.strip() for p in re.split(r'\n\s*\n', input_text) if p.strip()] result_list = [] for para_index, paragraph in enumerate(paragraphs, start=1): # 拆分段落为有效行,过滤空行 lines = [line.strip() for line in paragraph.split('\n') if line.strip()] total_lines = len(lines) if total_lines == 0: result_list.append((para_index, 0.0)) continue # 统计匹配目标氨基酸的行数 match_count = 0 for line in lines: # 提取每行第一个字段(氨基酸缩写) aa_abbr = line.split()[0] if aa_abbr in TARGET_AA: match_count += 1 # 计算占比,保留四位小数 ratio = round(match_count / total_lines, 4) result_list.append((para_index, ratio)) return result_list # 示例输入文本 sample_input = """THR 61 65.21 LEU 62 63.85 PRO 63 54.61 LEU 64 50.74 ALA 65 57.40 PRO 66 56.49 ASP 67 56.77 PRO 68 55.94 TYR 69 56.06 PRO 70 56.55 GLY 71 57.74 HIS 72 55.69 ASN 73 64.70 PRO 74 65.70 ASP 422 65.05 SER 423 53.19 SER 424 45.39 ARG 425 47.80 ALA 426 48.84 ARG 427 46.19 ALA 428 46.81 SER 429 51.64 GLY 430 56.53 GLY 431 69.14 ASP 471 59.01 VAL 472 51.82 ASP 473 52.63 GLN 474 45.86 LEU 475 44.30 SER 476 45.83 LEU 477 45.78 THR 478 37.91 PRO 479 44.77 VAL 480 41.47 VAL 481 46.86 PRO 482 46.12 GLY 483 46.38 PRO 484 49.42 PRO 485 57.74 """ # 执行计算并输出结果 ratios = compute_aa_ratio(sample_input) for para_num, ratio in ratios: print(f"段落{para_num}: 匹配行占比 = {ratio:.4f}")
代码说明
- 段落分割:用正则表达式
re.split(r'\n\s*\n', input_text)按空行拆分段落,自动过滤掉无内容的空段落; - 行处理:对每个段落拆分出有效行,统计总行数;
- 匹配统计:遍历每行提取第一个字段(氨基酸缩写),判断是否在目标集合中,累计匹配行数;
- 占比计算:用匹配行数除以总行数得到占比,保留四位小数;
- 结果输出:按段落序号输出对应占比。
内容的提问来源于stack exchange,提问作者Oreniko
相关产品推荐
相关产品推荐

