Hw4_Grigoriants#19
Conversation
Add 'search_for_alt_frames' and 'convert_to_nucl_acids' functions
…into HW4_Grigoriants
Add three_one_letter_code and define_molecular_weight functions
…into HW4_Grigoriants
| ## Usage | ||
| The programm is based on `run_protein_tools` function that takes the list of **one-letter amino acid sequences**, a name of procedure and a relevant argument. If you have three-letter amino acids sequences you could convert them by using `three_one_letter_code` procedure in advance. Please convert your three-letter coded sequences with `three_one_letter_code` procedure before using any other procedures on them. | ||
|
|
||
| To start with the program run the following command: | ||
|
|
||
| `run_protein_tools(sequences, procedure="procedure", ...)` | ||
|
|
||
| Where: | ||
| - sequences - positional argument, a list of protein sequences | ||
| - procedure - keyword argument, a type of procedure to use that is inputed in *string* type | ||
| - ... - an additional keyword arguments that are to be inputed in *string* type | ||
| - | ||
| Before start, check the *Options* and *Examples*. |
| @@ -0,0 +1,106 @@ | |||
| amino_acids = { | |||
There was a problem hiding this comment.
Поскольку это константа, то имя переменной должно быть в uppercase
| "w": "trp", | ||
| "y": "tyr", | ||
| } | ||
| translation_rule = { |
There was a problem hiding this comment.
Поскольку это константа, то имя переменной должно быть в uppercase
| "G": "GGC", | ||
| "g": "ggc", | ||
| } | ||
| amino_acid_weights = { |
There was a problem hiding this comment.
Поскольку это константа, то имя переменной должно быть в uppercase
| if "-" not in sequence: | ||
| for letter in sequence: | ||
| inversed_sequence += dictionaries.amino_acids[letter] + "-" | ||
| inversed_sequence = inversed_sequence[:-1] | ||
| inversed_sequences.append(inversed_sequence) |
There was a problem hiding this comment.
Проще было бы собирать аминокислоты в список, а потом через join добавить "-"
Так и костыля inversed_sequence = inversed_sequence[:-1] не было бы
| aa_splitted = sequence.split("-") | ||
| for aa in aa_splitted: | ||
| inversed_sequence += list(dictionaries.amino_acids.keys())[ | ||
| list(dictionaries.amino_acids.values()).index(aa) | ||
| ] | ||
| inversed_sequences.append(inversed_sequence) |
| for sequence in sequences: | ||
| sequence_weight = 0 | ||
| for letter in sequence: | ||
| sequence_weight += dictionaries.amino_acid_weights[letter.upper()] |
There was a problem hiding this comment.
Это хорошо, если учесть, что идет обращение к единственному словарю, где все а\к записаны один раз в upper-case!
There was a problem hiding this comment.
А вот вопрос. В задании нам требовалось оставлять регистр символов в исходном формате. Т. е. 'Rm' -> 'Arg-met'
А как нам сделать один словарь только в upper-case, если нам нужен чувствительный регистр?
Грубо говоря, в молекулярном весе нам в этом нет необходимости, но в остальных функциях это требуется.
И при переводе в lower- upper-case мы теряем уникальность исходного регистра.
Или есть какой-то дополнительный метод, который позволит нам это сделать?
There was a problem hiding this comment.
Например, это можно сделать проверкой .isupper()
| print(f"Sequence: {sequence}") | ||
| print(f"Motif: {motif}") |
| if overlapping: | ||
| start += 1 | ||
| else: | ||
| start += len(motif) |
| rule_of_translation = sequences[0].maketrans(dictionaries.translation_rule) | ||
| rule_of_transcription = sequences[0].maketrans("AaUuCcGg", "TtAaGgCc") |
There was a problem hiding this comment.
Зачем каждый раз при вызове функций заново создавать одинаковые словари? Если делать так, то уж выносить в константу
| for sequence in sequences: | ||
| rna_seq = sequence.translate(rule_of_translation) | ||
| dna_seq = rna_seq.translate(rule_of_transcription) | ||
| if nucl_acids == "RNA": |
There was a problem hiding this comment.
Переусложнение кода,
seq.translate(dictionaries.translation_rule)
будет работать тоже исправно, и без создания лишних словарей
There was a problem hiding this comment.
У меня так не работает(
Только через maketrans переводит
There was a problem hiding this comment.
Спасибо за замечания! Я в процессе разгребания всех этих словарей сама хоть маленько разобралась)
| if sequence == sequences[-1]: | ||
| del nucl_acid_seqs["RNA"] |
There was a problem hiding this comment.
Ненужная проверка, можно было сразу удалить и без условия
There was a problem hiding this comment.
Удалять без условия внутри цикла нельзя, потому что он удалит на первой же итерации, а уже на второй упадает с ошибкой, что удалять нечего, т.к удалил на первой итерации. Потому проверяем условие, что итерация последняя
There was a problem hiding this comment.
Таких пометки было две(для РНК и ДНК), случайно зарезолвил одну😅
| if nucl_acids == "both": | ||
| nucl_acid_seqs["RNA"].append(rna_seq) | ||
| nucl_acid_seqs["DNA"].append(dna_seq) | ||
| return nucl_acid_seqs |
There was a problem hiding this comment.
Код функции переусложнен, но идея понятная и хорошая,
Вывод очень user-friendly - круто!
| procedures_to_functions = { | ||
| "search_for_motifs": search_for_motifs, | ||
| "search_for_alt_frames": search_for_alt_frames, | ||
| "convert_to_nucl_acids": convert_to_nucl_acids, | ||
| "three_one_letter_code": three_one_letter_code, | ||
| "define_molecular_weight": define_molecular_weight, | ||
| } |
| """ | ||
| if len(sequences) == 0: | ||
| raise ValueError("No sequences provided") | ||
| procedure = kwargs["procedure"] |
| allowed_inputs = set(dictionaries.amino_acids.keys()).union( | ||
| set(dictionaries.amino_acids.values()) | ||
| ) |
| if procedure != "three_one_letter_code": | ||
| allowed_inputs -= set(dictionaries.amino_acids.values()) |
There was a problem hiding this comment.
Лучше бы наоборот, если procedure == "three_one_letter_code", то только тогда объединять множества, иначе получается две лишние операции для всех функций, кроме одной ( И туда же добавлять "-"
| if procedure == "three_one_letter_code" and "-" in sequence: | ||
| allowed_inputs_seq -= set(dictionaries.amino_acids.keys()) |
There was a problem hiding this comment.
Это тоже лишние операции
Лучше добавлять при необходимости, чем сначала делать большое множество, и потом из него что-то удалять
| if not all( | ||
| aminoacids in allowed_inputs_seq for aminoacids in sequence.split("-") | ||
| ): |
There was a problem hiding this comment.
Т.к. allowed_inputs_seq является множеством, то не надо итерироваться по всей послед-ти и элементам множества, а достаточно использовать методы множеств:
| if not all( | |
| aminoacids in allowed_inputs_seq for aminoacids in sequence.split("-") | |
| ): | |
| if not set(sequence.split("-")).issubset(allowed_inputs_seq): |
| allowed_inputs_seq.remove("-") | ||
| allowed_inputs_seq -= set(dictionaries.amino_acids.values()) | ||
| if not all(aminoacids in allowed_inputs_seq for aminoacids in sequence): | ||
| raise ValueError("Invalid sequence given") |
There was a problem hiding this comment.
Концептуально те же комментарии, что были выше: ненужные операции над сетами (добавлять\удалять что-то из сетов занимает больше времени, чем в случае списков, так что по возможности надо таких операций как можно меньше делать), ненужная итерация по всем эл-там последовательности и множества, неоптимальный код
|
Хорошая работа!
|
|
Пересчет баллов: README 2.4 (-докстринги, вставленные прямо в текст ридми) -0.1 нейминг констант |
|
Спасибо за тщательную проверку и полезные комментарии👍 Вид инпута - супер субъективно, никаких ограничений на это не давалось от Никиты, а список это стандартизованно. Про возможность вставки докстринга в ридми говорил Никита на лекции - потому так и сделали. Все, что «неоптимально» - использовали то, чему Никита успел научить и что сами успели вычитать 💁🏻♂️ В целом, как кажется мне и знакомому преподавателю плюсов на физтехе, - снимать за такие недочеты баллы - не очень справедливо. Во все формальные критерии мы уложились, все что больше - от лукавого :) На будущее - либо продумывайте лучше формальные критерии ( например, время обработки одной последовательности для каждой из функций не должно превышать х), либо оставляйте пожелания в виде комментариев, но не снимайте баллы за то, что мы не соответствуем негласным критериям. Они неочевидны, совсем. |
No description provided.