更新字典中的键名 python
Update key name in a dictionary python
我在字典中有以下 fasta 文件,格式如下:
from Bio import SeqIO
alignment_file = '/Users/dissertation/Desktop/Alignment 4 sequences.fasta'
seq_dict = {rec.id : rec.seq for rec in SeqIO.parse(alignment_file, "fasta")}
这给了我以下输入:
{'NC_000962.3': Seq('ctgttaccgagatttcttcgtcgtttgttcttggaaagacagcgctggggatcg...NNN'),
'NC_008596.1': Seq('------------------------------------------------------...ccg'),
'NC_009525.1': Seq('ctgttaccgagatttcttcgtcgtttgttcttggaaagacagcgctggggatcg...NNN'),
'NC_002945.4': Seq('ctgttaccgagatttcttcgtcgtttgttcttggaaagacagcgctggggatcg...NNN')}
这里唯一的问题是我想替换键名,以便在将序列与代码的其他部分进行比较时更容易识别。所以我尝试了以下方法:
name_list = ['Tuberculosis', 'Smegmatis', 'H37Ra', 'Bovis']
for key in seq_dict:
for name in name_list:
seq_dict[name[x]]= seq_dict[key]
seq_dict
但是我收到以下错误:
---------------------------------------------------------------------------
RuntimeError Traceback (most recent call last)
/var/folders/pq/ghtv3wj159j681vy0ny3tz9w0000gp/T/ipykernel_47822/1486954832.py in <module>
9
---> 10 for key in seq_dict:
11 for name in name_list:
12 seq_dict[name[x]]= seq_dict[key]
RuntimeError: dictionary changed size during iteration
我知道没有简单直接的方法来更新字典中的键名值,但我不明白其中的错误。有没有办法做类似的事情?
我也试过这个:
seq_dict.update({'NC_000962.3': 'Tuberculosis', 'NC_008596.1': 'Smegmatis', 'NC_009525.1': 'H37Ra', 'NC_002945.4': 'Bovis'})
但这给了我以下输出:
{'NC_000962.3': 'Tuberculosis',
'NC_008596.1': 'Smegmatis',
'NC_009525.1': 'H37Ra',
'NC_002945.4': 'Bovis'}
我的期望输出如下所示:
{'Tuberculosis': Seq('ctgttaccgagatttcttcgtcgtttgttcttggaaagacagcgctggggatcg...NNN'),
'Smegmatis': Seq('------------------------------------------------------...ccg'),
'H37Ra': Seq('ctgttaccgagatttcttcgtcgtttgttcttggaaagacagcgctggggatcg...NNN'),
'Bovis': Seq('ctgttaccgagatttcttcgtcgtttgttcttggaaagacagcgctggggatcg...NNN')}
有人知道如何更新这些吗?
构造一个新字典,然后在一次操作中将其分配给 seq_dict
,而不是在迭代它的过程中改变 seq_dict
。我认为这就是您的目标:
seq_dict = dict(zip(name_list, seq_dict.values()))
尽管我个人希望有一个从序列 ID 到名称的显式映射,而不是依赖于相同的顺序。
我在字典中有以下 fasta 文件,格式如下:
from Bio import SeqIO
alignment_file = '/Users/dissertation/Desktop/Alignment 4 sequences.fasta'
seq_dict = {rec.id : rec.seq for rec in SeqIO.parse(alignment_file, "fasta")}
这给了我以下输入:
{'NC_000962.3': Seq('ctgttaccgagatttcttcgtcgtttgttcttggaaagacagcgctggggatcg...NNN'),
'NC_008596.1': Seq('------------------------------------------------------...ccg'),
'NC_009525.1': Seq('ctgttaccgagatttcttcgtcgtttgttcttggaaagacagcgctggggatcg...NNN'),
'NC_002945.4': Seq('ctgttaccgagatttcttcgtcgtttgttcttggaaagacagcgctggggatcg...NNN')}
这里唯一的问题是我想替换键名,以便在将序列与代码的其他部分进行比较时更容易识别。所以我尝试了以下方法:
name_list = ['Tuberculosis', 'Smegmatis', 'H37Ra', 'Bovis']
for key in seq_dict:
for name in name_list:
seq_dict[name[x]]= seq_dict[key]
seq_dict
但是我收到以下错误:
---------------------------------------------------------------------------
RuntimeError Traceback (most recent call last)
/var/folders/pq/ghtv3wj159j681vy0ny3tz9w0000gp/T/ipykernel_47822/1486954832.py in <module>
9
---> 10 for key in seq_dict:
11 for name in name_list:
12 seq_dict[name[x]]= seq_dict[key]
RuntimeError: dictionary changed size during iteration
我知道没有简单直接的方法来更新字典中的键名值,但我不明白其中的错误。有没有办法做类似的事情?
我也试过这个:
seq_dict.update({'NC_000962.3': 'Tuberculosis', 'NC_008596.1': 'Smegmatis', 'NC_009525.1': 'H37Ra', 'NC_002945.4': 'Bovis'})
但这给了我以下输出:
{'NC_000962.3': 'Tuberculosis',
'NC_008596.1': 'Smegmatis',
'NC_009525.1': 'H37Ra',
'NC_002945.4': 'Bovis'}
我的期望输出如下所示:
{'Tuberculosis': Seq('ctgttaccgagatttcttcgtcgtttgttcttggaaagacagcgctggggatcg...NNN'),
'Smegmatis': Seq('------------------------------------------------------...ccg'),
'H37Ra': Seq('ctgttaccgagatttcttcgtcgtttgttcttggaaagacagcgctggggatcg...NNN'),
'Bovis': Seq('ctgttaccgagatttcttcgtcgtttgttcttggaaagacagcgctggggatcg...NNN')}
有人知道如何更新这些吗?
构造一个新字典,然后在一次操作中将其分配给 seq_dict
,而不是在迭代它的过程中改变 seq_dict
。我认为这就是您的目标:
seq_dict = dict(zip(name_list, seq_dict.values()))
尽管我个人希望有一个从序列 ID 到名称的显式映射,而不是依赖于相同的顺序。