Вы можете использовать несколько счетчиков, чтобы получить отдельные счетчики для видов и определенных видов в дополнение к счетчику busco , например:
import collections
busco = collections.defaultdict(int) # busco counter
species = collections.defaultdict(int) # species counter
specific_species = collections.defaultdict(int) # specific species counter
with open("concatenate_with_busco_names_0035_0042_aa.fa", "r") as f:
for line in f:
if line[:4] == ">EOG":
entry = line.split()[0][4:].split('_')
busco[entry[0]] += 1
species[entry[1]] += 1
specific_species[entry[1] + "_" + entry[2]] += 1
print("Total busco: {}".format(len(busco)))
for specie, total in species.items():
print("Total busco for the specie {}: {}".format(specie, total))
for specie, total in specific_species.items():
print("Total busco for the specific specie {}: {}".format(specie, total))
Что должно дать:
Total busco: 5
Total busco for the specie 0035: 3
Total busco for the specie 0042: 4
Total busco for the specific specie 0035_0042: 3
Total busco for the specific specie 0042_0042: 4
Внесенные в список (конкретные) виды не будут отображаться, но если вы действительно хотите распечатать их, вы можете объединить их со счетчика species
и распечатать ихзначения (по умолчанию 0
):
import itertools
print("Total busco: {}".format(len(busco)))
for specie, total in species.items():
print("Total busco for the specie {}: {}".format(specie, total))
for specie in itertools.product(species, species):
s = "_".join(specie)
print("Total busco for the specific specie {}: {}".format(s, specific_species[s]))
Что дает:
Total busco: 5
Total busco for the specie 0035: 3
Total busco for the specie 0042: 4
Total busco for the specific specie 0035_0035: 0
Total busco for the specific specie 0035_0042: 3
Total busco for the specific specie 0042_0035: 0
Total busco for the specific specie 0042_0042: 4
ОБНОВЛЕНИЕ : если вы хотите получить уникальные значения для busco, затем вам нужно инвертировать счет в индекс для specie / конкретный образец и собрать busco значения в set
в качестве их значения.Тогда все, что вам нужно, это получить длину каждого набора, что-то вроде:
import collections
import itertools
busco = set()
species = collections.defaultdict(set)
specific_species = collections.defaultdict(set)
with open("concatenate_with_busco_names_0035_0042_aa.fa", "r") as f:
for line in f:
if line[:4] == ">EOG":
entry = line.split()[0][4:].split('_')
busco.add(entry[0])
species[entry[1]].add(entry[0])
specific_species[entry[1] + "_" + entry[2]].add(entry[0])
print("Total busco: {}".format(len(busco)))
for specie, buscos in species.items():
print("Total busco for the specie {}: {}".format(specie, len(buscos)))
for specie in itertools.product(species, species):
s = "_".join(specie)
print("Total busco for the specific specie {}: {}".format(s, len(specific_species[s])))
Что для печати ваших полных данных:
Total busco: 421
Total busco for the specie 0035: 402
Total busco for the specie 0042: 397
Total busco for the specific specie 0035_0035: 392
Total busco for the specific specie 0035_0042: 262
Total busco for the specific specie 0042_0035: 305
Total busco for the specific specie 0042_0042: 383