如何向 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
我是编程新手,出于生物学目的,我正在努力进入 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']
.
你提到你这样做是为了习惯 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