Учебная страница курса биоинформатики,
год поступления 2013
Задание
1. (1 балл) Перепишите следующие циклы в виде соответствующих генераторов:
(по 0.25 балла за каждый цикл)
1.1.
1.2.
1 import random
2 random.seed()
3 all_fields = ['CHROM', 'POS', 'ID', 'REF', ALT', 'QUAL', 'INFO', 'FORMAT', 'SAMPLE']
4 results = [31, 30, 0, 75, 43, 8, 79, 95, 69, 3]
5 stats = {}
6 for field_name, score in zip(all_fields, results): # zip создает новый список из кортежей из пар элементов из переданных ему списков; если вы не знаете как это работает - просто попробуйте выполнить этот код - проще один раз увидеть, чем объяснить
7 stats[field_name] = score
8 print(stats)
1.3.
1.4.
2. (1 балл) Скачайте текстовый файл, который содержит результаты работы некоторой программы - либо числовое значение, либо 'error'.
Прочитайте из него только числовые значения, вычислите их среднее, вычтите среднее из каждого числа и результаты запишите в другой файл.
Чтение из файла в список и фильтрация должны быть сделаны в 1 строку с использованием генератора.
* 3. (2 балла) Скачайте библиотеку vcf.py и файл sample.vcf для работы.
Функция main vcf.py считывает файл ".vcf" в итератор, выполняет над этим итератором преобразование, создавая при этом новый итератор, и перебирает элементы нового итератора, записывая их в конечный файл. Это типичный пример ленивых вычислений: работая таким образом (через итераторы), вы гарантируете, что в любой момент времени в память загружено не более 1 строки исходного файла. Более того, пока вы не начнете запись результатов в функции write_table, исходный файл даже не начнет читаться (см. далее)!
Ваша задача - реализовать фильтрацию во второй строке main() - это единственная строка, которую разрешается поменять: напишите в выходной файл только строки с вариантами из позиций в интервале 11 000 000 - 12 000 000 и качеством QUAL >= 500. Фильтрация должна быть однострочником, чтобы проверить как вы умеете их писать, и выражением-генератором - то есть записывать в filtered_rows не список, а генератор, который будет по одному возвращать строки, соответствующие условиям. Ни в какой момент времени в памяти программы не должно храниться больше одной строки.
При правильном решении выходной файл output_table из write_table(), будет открыт раньше, чем входной файл input_vcf в read_vcf(), несмотря на то, что вызов write_table() стоит позже, чем вызов read_vcf()! Проверьте, что это так, установив print'ы в соответствующие места вашего кода.