Я помогаю моей подруге с заданием. Часть этого задания - это вычисление количества возможных комбинаций в последовательности ДНК, которая содержит определенные подстановочные знаки.Обновление словаря в функции
Я использую следующий питон скрипт:
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, но я не мог найти ответ на этот вопрос в Интернете.
Спасибо за помощь!
Я не знаю, является ли это прямой причиной вашей проблемы, но это, безусловно, стоит исправить: некоторые из ваших строк имеют отступы с пробелами, а некоторые имеют отступы с вкладками. В частности, 'd = {}', 'd.update ({name: pos})' и 'return d' - все вкладки.Смешивание стилей отступов может смутить парсер языка и вызвать странное поведение. Я рекомендую повторно отступать каждую из этих строк, используя только пробелы. – Kevin
Если 'short' или' long' пуст (независимо от того, что они есть), цикл 'for' в' pos_seq' не будет выполнен, а 'd' останется пустой dict. – DeepSpace
Полностью не связан, но вы хотите заменить 'if ltr в IUPAC.keys()' на 'if ltr в IUPAC' - это быстрее _much_. Кроме того, вам вообще не нужно вызывать 'd.update()', вы можете просто использовать синтаксис подстроки 'd [name] = pos'. Не то чтобы что-то из этого исправит вашу проблему на самом деле, но хорошо ... –