不知道如何阻止字典键覆盖自己
Can't figure how to stop dictionary keys from overwriting themselves
我正在尝试创建字典,但我的字典键不断覆盖自己。我不明白我该如何处理这个问题。
这是脚本:
import MDAnalysis as mda
u = mda.Universe('rps5.prmtop', 'rps5.inpcrd')
ca = u.select_atoms('protein')
charges = ca.charges
atom_types = ca.names
resnames = ca.resnames
charge_dict = {}
for i in range(len(charges)):
#print(i+1 ,resnames[i], atom_types[i], charges[i])
charge_dict[resnames[i]] = {}
charge_dict[resnames[i]][atom_types[i]] = charges[i]
print(charge_dict)
charges、atom_types和resnames都是列表,有相同数量的元素。
我希望我的字典看起来像这样:charge_dict[resname][atom_types] = charges(例如,charge_dict['MET']['CA'] = 0.32198)。
你能帮我解决这个问题吗?
没有真正看到完整的问题描述,我的猜测是你的最终结果是每个 charge_dict[name]
是一个只有一个键的字典。那不是因为密钥“覆盖了自己”。您的程序明确覆盖它们:charge_dict[resnames[i]] = {}
.
您想要的是仅在尚未设置该键的情况下重置该键的值。您可以通过首先测试 if resnames[i] not in charge_dict:
轻松地做到这一点,但是 Python 标准库提供了一个更简单的机制:collections.defaultdict
。 defaultdict
是具有关联的默认值创建者的字典。所以你可以这样做:
from collections import defaultdict
charge_dict = defaultdict(dict)
在那之后,你就不需要担心初始化 charge_dict[name]
因为当默认值函数 (dict
) 被调用时,一个新的字典会自动 spring 存在。
我正在尝试创建字典,但我的字典键不断覆盖自己。我不明白我该如何处理这个问题。
这是脚本:
import MDAnalysis as mda
u = mda.Universe('rps5.prmtop', 'rps5.inpcrd')
ca = u.select_atoms('protein')
charges = ca.charges
atom_types = ca.names
resnames = ca.resnames
charge_dict = {}
for i in range(len(charges)):
#print(i+1 ,resnames[i], atom_types[i], charges[i])
charge_dict[resnames[i]] = {}
charge_dict[resnames[i]][atom_types[i]] = charges[i]
print(charge_dict)
charges、atom_types和resnames都是列表,有相同数量的元素。
我希望我的字典看起来像这样:charge_dict[resname][atom_types] = charges(例如,charge_dict['MET']['CA'] = 0.32198)。
你能帮我解决这个问题吗?
没有真正看到完整的问题描述,我的猜测是你的最终结果是每个 charge_dict[name]
是一个只有一个键的字典。那不是因为密钥“覆盖了自己”。您的程序明确覆盖它们:charge_dict[resnames[i]] = {}
.
您想要的是仅在尚未设置该键的情况下重置该键的值。您可以通过首先测试 if resnames[i] not in charge_dict:
轻松地做到这一点,但是 Python 标准库提供了一个更简单的机制:collections.defaultdict
。 defaultdict
是具有关联的默认值创建者的字典。所以你可以这样做:
from collections import defaultdict
charge_dict = defaultdict(dict)
在那之后,你就不需要担心初始化 charge_dict[name]
因为当默认值函数 (dict
) 被调用时,一个新的字典会自动 spring 存在。