如何向 Python 词典中的现有键添加附加值?

How to add an additional value to an existing key in Python dictionaries?

我是编程新手,出于生物学目的,我正在努力进入 Python。目前我想测试自己计算 FASTA 格式的 DNA 序列的 GC 含量。如果这个问题已经以某种方式得到解答,我深表歉意,但我无法将任何可能的解决方案转移到我的特定问题(probably/hopefully 由于缺乏经验)。

因此,出于上述目的,我创建了一个字典,其中单行(包含 FASTA 文件中的标识符)作为键,相应的 DNA 序列作为 str 值。我的想法是将计算出的 GC 内容(一个浮点数)作为附加值添加到现有键中,以便您将所有内容放在一起。但是最后一步我还是失败了。

那么如何向现有键添加附加值?我试过使用

dictionary[key].append(GC_content) 

就像我用列表来添加 GC 内容一样。但是我得到一个 AttributeError: 'str' object has no attribute 'append'.

这是我计算 GC 内容并在字典中添加第二个值的方法:

GC_counter = 0
for key in dictionary:
    for char in dictionary[key]:
        if char == 'G' or char == 'C':
            GC_counter += 1
    GC_content = GC_counter/float(len(dictionary[key]))*100
    dictionary[key].append(GC_content)

非常感谢任何帮助!

有多种方法可以解决这个问题。要回答您最初的问题,如果您决定将 GC 内容放入预先存在的字典的键中,那么这将起作用:

d = {'read1': 'ATGCATGCTAGCATGAC',
     'read2': 'ATGCATTTGACCAGTGA'}
for key, seq in d.copy().iteritems():
    gc_counter = 0
    for base in seq:
        if base in ['G', 'C']:
            gc_counter += 1.
    gc_content = gc_counter / len(seq) * 100.
    d['{}_{}'.format(key, gc_content)] = d.pop(key)

哪个returns:

{'read1_47.0588235294': 'ATGCATGCTAGCATGAC', 'read2_41.1764705882': 'ATGCATTTGACCAGTGA'}

但是,我建议只将它作为附加值添加到字典中,这样可以使事情变得更整洁,并且以后更容易访问 GC 内容:

d = {
    'read1': 'ATGCATGCTAGCATGAC',
    'read2': 'ATGCATTTGACCAGTGA'
}
for key, seq in d.iteritems():
    gc_counter = 0
    for base in seq:
        if base in ['G', 'C']:
            gc_counter += 1.
    gc_content = gc_counter / len(seq) * 100.
    d[key] = {'seq': seq, 'gc_content': gc_content}

那么您将以 d[read]['gc_content'].

的形式访问读取的 GC 内容

你提到你这样做是为了习惯 Python 所以我不会详细介绍如何有库自动执行此操作(我假设你可能知道这一点)但是会将您指向 Biopython 的方向。从他们的文档中获取你可以做这样的事情:

from Bio.Seq import Seq
from Bio.Alphabet import IUPAC
from Bio.SeqUtils import GC
my_seq = Seq('GATCGATGGGCCTATATAGGATCGAAAATCGC', IUPAC.unambiguous_dna)
GC(my_seq) # 46.875