计数序列数(不重复)

时间:2018-05-14 16:54:01

标签: python python-3.x

我实际上有一个这样的multifasta文件:

>seqA_0042_0035
AGGACCATGA
>seqB_0035_0042
ATGGATGGAGGAGATG
>seqC_0042_0035
AGGATGGAGGATAG
>seqA_0042_0035
ATGGAGAGAG
>seqD_0042_0035
ATTGGGAA
>seqC_0035_0042
ATGGGAGAGAAGA
>seqA_0042_0035

我只想计算我有多少序列(带有ID名称)但是如果我有一个seqA例如只计算一次,即使它出现两次,我想保持juste一次。 _number_number无所谓,它们一直在变化。

对于这个例子,我将输出:序列号:4

谢谢:)

2 个答案:

答案 0 :(得分:3)

创建一个包含标签的哈希集,扫描文件,将每个标签添加到哈希集:

set_of_labels = set()

with open("path/to/my_multi_FASTA_file") as f:
  for line in f:
    if line.startswith('>seq'):
      label = line[4:].split('_')[0]
      set_of_labels.add(label)

print(f"Number of distinct labels: {len(set_of_labels)}")

输出:

Number of distinct labels: 4

重复项会自动删除,因为该集合始终只包含每个元素的一个副本。

我已删除了>seq - 部分以及>seqX_Y_Z - 标签中的数字,所以我只保留X。如果您需要其他内容,请相应地调整label = ....中子字符串的选择。

答案 1 :(得分:1)

如果文件内容与您指定的相同,则可以解决您的查询问题:

lst = []

with open('path/to/file', 'r') as f:
    for line in f:
        if line.startswith('>seq') and line[4] not in lst:
            lst.append(line[4])

print(lst)
# ['A', 'B', 'C', 'D']

print(len(lst))
# 4