我正在帮助我的女朋友完成任务。这项任务的一部分是计算包含某些通配符的DNA序列中可能的组合数。
我正在使用以下python脚本:
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方面不是很有经验,但我在网上找不到这个问题的答案。
感谢您的帮助!
答案 0 :(得分: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个空格,但是当你进入编辑模式时,你将能够复制和粘贴标签(试一试)。
这就是为什么,即使仍有错误,您的代码也无效。