Итак, было немного назад и вперед относительно ваших требований, но мое окончательное понимание таково:
Вы зацикливаетесь на наборе данных. Каждый target
в этом наборе данных имеет атрибуты locus
, mri
и gene
, а также атрибут UTR_length
. Для каждой уникальной комбинации locus
, mri
и gene
вы пытаетесь найти все targets
, которые имеют максимум UTR_Length
?
Учитывая, что вы хотите найти максимальное значение в наборе данных, есть два подхода.
1) Вы можете просто преобразовать ваш входной файл в кадр данных pandas, сгруппировать по значениям locus
, mri
и gene
и вернуть все значения с максимальным значением (UTR_Length
). Из-за простоты реализации это, вероятно, ваш лучший выбор. Тем не менее, панды не всегда являются правильным инструментом и несут много накладных расходов, особенно если вы хотите докеризировать свой проект.
2) Если вы хотите использовать базовые пакеты Python, я бы порекомендовал воспользоваться наборами и словарями:
targets = open(file)
list_of_targets = []
for line in targets:
chromosome, locus, mir, gene, transcript, UTR_length = line.strip("\n").split("\t")
length_as_integer = int(UTR_length)
list_of_targets.append((chromosome, locus, mir, gene, transcript, UTR_length))
# Generate Set of unqiue locus, mri, gene (lmg) combinations
set_of_locus_mri_gene = {(i[1], i[2], i[3]) for i in list_of_targets}
# Generate dictionary of maximum lengths for each distinct lmg combo
dict_of_max_lengths = {lmg: max([targets[5] for targets in list_of_targets if
(targets[1], targets[2], targets[3]) == lmg]) for
lmg in set_of_locus_mri_gene}
# Generate dictionary with lmg keys and all targets with corresponding max length
final_output = {lmg: [target for target in list_of_targets if target[5] == max_length] for
lmg, max_length in dict_of_max_lengths.items()}