2015-03-26 1 views
0

Python: 2.7.9 Я удалил весь свой код, потому что я схожу с ума. Вот суть (его для Розалинд вызова штуковины):Wit's end с файлом to dict

Я хочу взять файл, который выглядит следующим образом (без кавычек на CARETS)

">" Rosalind_0304
actgatcgtcgctgtactcg
actcgactacgtagctacgtacgctgcatagt

">" Rosalind_2480
gctatcggtactgcgctgctacgtg
ccccccgaagaatagatag

«>» Rosalind_2452
cgtacgatctagc
aaattcgcctcgaactcg и т.д ...

То, что я не могу понять, как сделать это в основном все на данный момент, мой ум так запутано. Я просто покажу, что я делаю, но не могу.

1-й. Я хочу найти файл для '>' Затем назначьте остальную часть этой строки в словаре в качестве ключа. прочитайте следующие строки до следующего «>» и выполните некоторые вычисления и верните значения в значение для этого ключа. просмотрите файл и сделайте это для каждой строки.

затем сравните все значения и верните ключ от того, что самое высокое. Может ли кто-нибудь помочь? Это может помочь, если я просто сделаю перерыв. Весь день я кодировал, и я думаю, что я чувствую запах цветов.

def func(dna_str): 
     bla 
     return gcp #gc count percentage returned to the value in dict 
+0

Итак, вы хотите словарь смотреть что-то вроде '{ 'Rosalind_0304': my_function ('actgatcgtcgctgtactcg')} '? И тогда вам нужен ключ, соответствующий самому высокому значению? – TigerhawkT3

+0

Да. значения будут иметь число, равное 60,2048, что на самом деле составляет процент. Я попытаюсь снова решить эту проблему, но чтение фрагментов из файла - это то, что почему-то блокирует меня. –

+0

Да, вам понадобится функция, которая принимает строку типа '' gattaca'' в качестве аргумента, затем выполняет свою работу, а затем возвращает значение типа '60.2048'. – TigerhawkT3

ответ

0

С my_function где-то, что возвращает этот процент значение:

with open('rosalind.txt', 'r') as ros: 
    rosa = {line[1:].split(' ')[0]:my_function(line.split(' ')[1].strip()) for line in ros if line.strip()} 
top_key = max(rosa, key=rosa.get) 
print(top_key, rosa.get(top_key)) 

Для каждой строки в файле, который сначала проверяет, есть ли что-нибудь осталось от линии после зачистки завершающие пробельные, затем удалите пустой линий. Затем он добавляет каждую непустую строку как запись в словарь, при этом ключ находится все слева от пространства, за исключением ненужного >, а значение является результатом отправки всего справа от места на ваш функция.

Затем он сохраняет ключ, соответствующий наивысшему значению, затем печатает эту клавишу вместе со своим соответствующим значением. У вас есть словарь rosa, который вы можете обрабатывать, как вам нравится.


Полный код модуля:

def my_function(dna): 
    return 100 * len(dna.replace('A','').replace('T',''))/len(dna) 

with open('rosalind.txt', 'r') as ros: 
    with open('rosalind_clean.txt', 'w') as output: 
     for line in ros: 
      if line.startswith('>'): 
       output.write('\n'+line.strip()) 
      elif line.strip(): 
       output.write(line.strip()) 

with open('rosalind_clean.txt', 'r') as ros: 
    rosa = {line[1:].split(' ')[0]:my_function(line.split(' ')[1].strip()) for line in ros if line.strip()} 
top_key = max(rosa, key=rosa.get) 
print(top_key, rosa.get(top_key)) 

Полное содержание rosalind.txt:

>Rosalind_6404 CCTGCGGAAGATCGGCACTAGAATAGCCAGAACCG 
TTTCTCTGAGGCTTCCGGCCTTCCCTCCCACTAATAATTCTGAGG 
>Rosalind_5959 CCATCGGTAGCGCATCCTTAGTCCAATTAAGTCCCTATCCA 
GGCGCTCCGCCGAAGGTCTATATCCA 
TTTGTCAGCAGACACGC 
>Rosalind_0808 CCACCCTCGTGGT 

ATGGCTAGGCATTCAGGAACCGGAGAACGCTTCAGACCAGCCCGGACTGGGAACCTGCGGGCAGTAGGTGGAAT 

Результат при запуске модуля:

Rosalind_0808 60.91954022988506 

Это должно правильно обрабатывать входной файл, который не обязательно содержит одну запись в строке.


форматирование руководство видеть так, чтобы узнать, как сделать инлайн или блок кода тегов, чтобы получить последние вещи, как ">". Если вы хотите, чтобы выглядеть как обычный текст, а не код, избежать > с обратной косой черты:

Тип:

\>Rosalind 

Результат:

> Розалинда

+0

Спасибо, но я собираюсь пойти и просто уйти. Это слишком для меня. Я понимаю, что вы написали, и это хорошо, но теперь мне нужно написать функцию, и я не могу. Однако, спасибо. –

+0

Что должна делать функция? – TigerhawkT3

+0

Спасибо. Я просто откажусь от этого, я думаю. –

0

Я думаю, что я получил, что часть вниз сейчас. Спасибо. BUUUUT. Это его ошибка.

 rosa = {line[1:].split(' ')[0]:calc(line.split(' ')[1].strip()) for line in ros if line.strip()} 

IndexError: список индексов вне диапазона

это моя FUNC кстати.

def calc(dna_str): 

    for x in dna_str: 
     if x == 'G': 
      gc += 1 
      divc += 1 
     elif x == 'C': 
      gc += 1 
      divc += 1 
     else: 
      divc += 1 

    gcp = float(gc/divc) 

return gcp 
+0

'calc' должен инициализировать свои счетчики' gc' и 'divc' (установите их' 0') перед их добавлением.Если ваше описание 'rosalind.txt' является точным, эта функция должна обрабатывать строчные буквы, а не прописные. Что касается трассировки, есть ли в файле строки, которые являются чем-то иным, чем: 1. пустая строка или 2. что-то в форме '> Rosalind_1234 agtctagca'? – TigerhawkT3

+0

Кроме того, эту функцию можно было бы упростить, чтобы вернуть 100 * len (dna_str.replace ('A', ''). Replace ('T', ''))/len (dna_str) '. – TigerhawkT3

+0

Я был ленив. буквы - это шапки. файл выглядит следующим образом. > Rosalind_0292 \ n letters \ n > Rosalind_2844 \ n letters –

0

Точный тестовый файл. нет пустых строк до или после.
> Rosalind_6404 CCTGCGGAAGATCGGCACTAGAATAGCCAGAACCGTTTCTCTGAGGCTTCCGGCCTTCCC TCCCACTAATAATTCTGAGG
> Rosalind_5959 CCATCGGTAGCGCATCCTTAGTCCAATTAAGTCCCTATCCAGGCGCTCCGCCGAAGGTCT ATATCCATTTGTCAGCAGACACGC
> Rosalind_0808 CCACCCTCGTGGTATGGCTAGGCATTCAGGAACCGGAGAACGCTTCAGACCAGCCCGGAC TGGGAACCTGCGGGCAGTAGGTGGAAT