从每行中提取 char 的位置并提供整个列表中的位置聚合

extract position of char from each row & provide an aggregate of position across a list

我需要一些 python 帮助来解决这个问题。将不胜感激任何帮助!谢谢。

我需要一个包含在方括号中的值的提取矩阵。下面是一个玩具示例:

文件输入将在一个 txt 文件中,如下所示:

AB_1Q[A]IHY[P]GVA

AB_2Q[G][C]HY[R]GVA

AB_3Q[G][C]HY[R]GV[D]

答案out.txt:脚本从输入的每一行中提取包含在sq.brackets“[]”之间的字符的索引,并为整个列表生成索引位置的聚合。然后使用聚合索引从输入文件中提取所有这些位置并生成如下矩阵。

索引 2,3,6,9

AB_1 [A],我,[P],A

AB_2[G],[C],[R],A

AB_3[G],[C],[R],[D]

如有任何帮助,我们将不胜感激!。谢谢。

如果您想将 table 减少到仅包含方括号条目的列,您可以这样做:

import re

def transpose(matrix):
    return [[matrix[j][i] for j in range(len(matrix))] for i in range(len(matrix[0]))]

with open("test_table.txt", "r") as f:
    content = f.read()

rows = [re.findall(r'(\[.\]|.)', line.split()[1]) for line in content.split("\n")]

columns = transpose(rows)
matching_columns = [[str(i + 1)] + column for i, column in enumerate(columns) if "[" in "".join(column)]

matching_rows = transpose(matching_columns)

headline = ["Index {}".format(",".join(matching_rows[0]))]
target_table = headline + ["AB_{0} {1}".format((i + 1), ",".join(line)) for i, line in enumerate(matching_rows[1:])]

with open("out.txt", "w") as f:
    f.write("\n".join(target_table))

首先,您希望 .txt 文件的内容用数组表示。不幸的是,您的输入数据还没有分隔符(如 .csv 文件),因此您需要注意这一点。要整理出这样的字符串 "Q[A]IHY[P]GVA",我建议使用正则表达式。

import re
cells = re.findall(r'(\[.\]|.)', "Q[A]IHY[P]GVA")

r'' 字符串中的模式匹配 方括号中的单个字符 只是一个单个字符re.findall() 方法 returns 所有匹配子字符串的列表,在这种情况下:['Q', '[A]', 'I', 'H', 'Y', '[P]', 'G', 'V', 'A']

rows = [re.findall(r'(\[.\]|.)', line.split()[1]) for line in content.split("\n")] 将此方法应用于文件中的每一行。 line.split()[1] 将省略行标签“AB_X”,因为它没有用。

将数据按 columns 排序更合适,因为您希望保留所有符合特定条件的列(包含括号中的条目)。为此,您只需转置 rows。这是由 transpose() 函数完成的。如果你导入了 numpy numpy.transpose(rows) 我猜是更好的选择。

接下来您想要获取所有满足您的条件的列"[" in "".join(column)。一行完成:matching_columns = [[str(i + 1)] + column for i, column in enumerate(columns) if "[" in "".join(column)] 这里 [str(i + 1)] 确实添加了您以后要使用的列索引。

现在剩下的很简单:将列转回行,重新标记行,将行数据格式化为适合您所需输出格式的字符串,然后将这些字符串写入 out.txt 文件。