我是编程新手,我正在尝试以生物为目的进入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)
非常感谢任何帮助!
答案 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']})