2016-12-27 3 views
0

Я помогаю моей подруге с заданием. Часть этого задания - это вычисление количества возможных комбинаций в последовательности ДНК, которая содержит определенные подстановочные знаки.Обновление словаря в функции

Я использую следующий питон скрипт:

from Bio import Seq 
from Bio import SeqIO 

short = SeqIO.parse('short.fasta', 'fasta') 
long = SeqIO.parse('long.fasta', 'fasta') 

# IUPAC dictionary 

IUPAC = { 
    'R': 2, 
    'Y': 2, 
    'S': 2, 
    'W': 2, 
    'K': 2, 
    'M': 2, 
    'B': 3, 
    'D': 3, 
    'H': 3, 
    'V': 3, 
    'N': 4 
} 

# Define method to count number of possible sequences 
def pos_seq(seqs): 
    d = {} 

    for record in seqs: 
     pos = 1  
     name = record.id 
     seq = record.seq 

     for ltr in seq: 
      if ltr in IUPAC.keys(): 
       pos = pos * IUPAC[ltr] 

     d.update({name : pos}) 
     print(name + ": " + str(pos) + " possibilities") 
     print("") 

    print("end of file") 
    print("") 

    return d 



print(pos_seq(short)) 
print(pos_seq(long)) 

Функция pos_seq принимает в коллекции последовательностей и возвращает количество возможностей для каждой последовательности.

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

В чем проблема: он всегда возвращает пустой словарь (как определено в начале метода).

Работает определение словаря по всему миру (вне функции); словарь правильно обновляется, поэтому проблема может заключаться в том, что я определил словарь в функции. Может быть, мне нужно изменить строку .update, чтобы указать словарь, который я хочу обновить, но не глобальный словарь?

Длинная история, чтобы задать простой вопрос: я не могу использовать функцию для создания словаря, обновлять его несколько раз, а затем возвращать. Он остается пустым.

Я не очень опытен в Python, но я не мог найти ответ на этот вопрос в Интернете.

Спасибо за помощь!

+3

Я не знаю, является ли это прямой причиной вашей проблемы, но это, безусловно, стоит исправить: некоторые из ваших строк имеют отступы с пробелами, а некоторые имеют отступы с вкладками. В частности, 'd = {}', 'd.update ({name: pos})' и 'return d' - все вкладки.Смешивание стилей отступов может смутить парсер языка и вызвать странное поведение. Я рекомендую повторно отступать каждую из этих строк, используя только пробелы. – Kevin

+1

Если 'short' или' long' пуст (независимо от того, что они есть), цикл 'for' в' pos_seq' не будет выполнен, а 'd' останется пустой dict. – DeepSpace

+0

Полностью не связан, но вы хотите заменить 'if ltr в IUPAC.keys()' на 'if ltr в IUPAC' - это быстрее _much_. Кроме того, вам вообще не нужно вызывать 'd.update()', вы можете просто использовать синтаксис подстроки 'd [name] = pos'. Не то чтобы что-то из этого исправит вашу проблему на самом деле, но хорошо ... –

ответ

1

После небольшого исследования озадачивающего вопроса, поднятого jez (при отсутствии ошибки отступов, несмотря на ошибку с отступом), я обнаружил, что причина, по которой работает ваш код.

Вы были отступом с 8 пробелами и вкладками непоследовательно. Это допускается в Python 2, но не имеет в Python 3. http://python3porting.com/differences.html#indentation

В Python 2 вкладка будет равна восьми пробелам как отступы, так что вы можете сделать отступ на одну строку с язычком, и следующая строка с восемью пространства.

В Python 3 вкладка соответствует только одной вкладке. Это означает, что каждый уровень отступов должен быть последовательным в использовании вкладок и пробелов.

Таким образом, если вы попробуете этот код:

print("Hello world!") 
def my_func(x): 
     print(x) 
    print(x) 

Он будет работать в Python 2, но вызовет ошибку отступа в Python 3.

Еще одна вещь, чтобы отметить о StackOverflow, что я выяснилось, что когда вы вставляете код с отступом в них, он будет отображаться как 4 пробела при отображении, но когда вы перейдете в режим редактирования, вы сможете скопировать и вставить вкладки (попробуйте).

И поэтому ваш код не работает, даже если все еще есть ошибки.

Смежные вопросы