更新函数中的词典

2024-04-19 20:12:48 发布

您现在位置:Python中文网/ 问答频道 /正文

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

谢谢你的帮助!在


Tags: 函数nameinpos字典序列recordseq
1条回答
网友
1楼 · 发布于 2024-04-19 20:12:48

在对jez提出的令人费解的问题(尽管存在缩进错误,但没有出现缩进错误)进行了一点研究之后,我发现了代码工作的原因。在

你用8个空格和制表符不一致地缩进。这在Python2中是允许的,但在Python3中是不允许的。http://python3porting.com/differences.html#indentation

In Python 2 a tab will be equal to eight spaces as indentation, so you can indent one line with a tab, and the next line with eight spaces.

In Python 3 a tab is only equal to another tab. This means that each indentation level has to be consistent in its use of tabs and spaces.

因此,如果您尝试以下代码:

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

它在Python2中可以工作,但在Python3中会出现缩进错误。在

关于StackOverflow的另一个值得注意的问题是,当你粘贴带有缩进的代码时,它在显示时会显示为4个空格,但是当你进入编辑模式时,你可以复制并粘贴标签(试试看)。在

这就是为什么,即使仍然有错误,代码也不能工作。在

相关问题 更多 >