如何在Python词典中为现有键添加其他值?

时间:2017-06-25 16:48:03

标签: python dictionary add bioinformatics key-value-store

我是编程新手,我正在尝试以生物为目的进入Python。目前,我想测试自己计算FASTA格式的DNA序列的GC含量。如果这个问题已经以某种方式得到回答,我很抱歉,但我无法将任何可能的解决方案转移到我的具体问题上(可能/希望由于缺乏经验)。

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

那么如何为现有密钥添加其他值?我试过用

dictionary[key].append(GC_content) 

就像我使用列表添加GC内容一样。但是我得到了一个AttributeError:' str'对象没有属性'追加'。

这是我为计算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)

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

有很多方法可以解决这个问题。要回答您的原始问题,如果您决定将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)

返回:

{'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}

然后,您可以将阅读的GC内容作为d[read]['gc_content']访问。

你提到你这样做是为了习惯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

答案 1 :(得分:-1)

假设您从其他地方获取此dict并且无法控制它的创建方式,您可以稍微检查以查看该值是字符串还是列表,并相应地追加。

if isinstance(dictionary[key], list): 
    dictionary[key].append(GC_content)
else:
    dictionary[key] = [dictionary[key], GC_content]

这一点是为了取代现有的一个会给你带来错误的班轮。

但是,如果您可以控制词典的创建方式,请考虑使用defaultdict包中的collections

from collections import defaultdict
data = defaultdict(list) # empty

创建新条目时,您可以这样做:

data[someKey].append(someValue)

稍后,当附加到现有条目时,您可以执行此操作:

data[someExistingKey].append(someNewValue)

这简化了你的代码。

演示:

>>> from collections import defaultdict
>>> data = defaultdict(list)
>>> data
defaultdict(<class 'list'>, {})
>>> data[1].append('sometext')
>>> data
defaultdict(<class 'list'>, {1: ['sometext']})
>>> data[1].append('someothertext')
>>> data
defaultdict(<class 'list'>, {1: ['sometext', 'someothertext']})