Kodomo

Пользователь

Учебная страница курса биоинформатики,
год поступления 2013

Задание

1. (1 балл) Перепишите следующие циклы в виде соответствующих генераторов:

(по 0.25 балла за каждый цикл)

1.1.

   1 cubes = []
   2 for i in xrange(10000):
   3     cubes.append(i*i*i)
   4 print(cubes)

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 results = []
   2 a = 10
   3 b = 2000
   4 c = 50
   5 for x in xrange(1000):
   6     score = -a*x*x + b*x + c
   7     if score > 0:
   8         results.append(score)

1.4.

   1 # подсказка: правильно подставьте выражение вида "a if b else c" в генератор
   2 results = {}
   3 a = 10
   4 b = 2000
   5 c = 50
   6 for x in xrange(1000):
   7     score = -a*x*x + b*x + c
   8     if score > 0:
   9         results[x] = score
  10     else:
  11         results[x] = -score

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'ы в соответствующие места вашего кода.