更新函数

时间:2016-12-27 14:04:33

标签: python dictionary biopython

我正在帮助我的女朋友完成任务。这项任务的一部分是计算包含某些通配符的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方面不是很有经验,但我在网上找不到这个问题的答案。

感谢您的帮助!

1 个答案:

答案 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个空格,但是当你进入编辑模式时,你将能够复制和粘贴标签(试一试)。

这就是为什么,即使仍有错误,您的代码也无效。