python - 如何遍历字典并对其元素进行操作?

标签 python python-2.7 loops dictionary

我有这本字典,其中键代表原子类型,值代表原子质量:

mass = {'H': 1.007825, 'C': 12.01, 'O': 15.9994, 'N': 14.0067, 'S': 31.972071,
        'P': 30.973762}

我想做的是创建一个给定分子的函数,例如('H2-N-C6-H4-C-O-2H'),迭代质量 字典并计算给定分子的原子质量。质量值必须乘以原子类型后面的数字:H2 = H.value * 2

我知道首先我必须隔离给定分子的键,为此我可以使用 string.split('-')。然后,我想我可以使用和 if block 来建立一个条件,如果给定分子的键在字典中则完成。但后来我不知道应该如何继续为字典的每个键找到质量。

预期的结果应该是这样的:

mass_counter('H2-N15-P3')

out[0] 39351.14

我该怎么做?

编辑:

这是我目前尝试过的

# Atomic masses
mass = {'H': 1.007825, 'C': 12.01, 'O': 15.9994, 'N': 14.0067, 'S': 31.972071, 
        'P': 30.973762}

def calculate_atomic_mass(molecule):
    """
    Calculate the atomic mass of a given molecule
    """
    mass = 0.0
    mol = molecule.split('-')

    for key in mass:
        if key in mol:
            atom = key

    return mass

print calculate_atomic_mass('H2-O')
print calculate_atomic_mass('H2-S-O4')
print calculate_atomic_mass('C2-H5-O-H')
print calculate_atomic_mass('H2-N-C6-H4-C-O-2H')

最佳答案

鉴于所有组件的形状都是 Aa123,在这里用正则表达式识别部件可能更容易,例如:

import re
srch = re.compile(r'([A-Za-z]+)(\d*)')
mass = {'H': 1.007825, 'C': 12.01, 'O': 15.9994, 'N': 14.0067, 'S': 31.972071, 'P': 30.973762}

def calculate_atomic_mass(molecule):
    return sum(mass[a[1]]*int(a[2] or '1') for a in srch.finditer(molecule))

这是我们的 regular expression [wiki]因此捕获了一系列 [A-Z-a-z] 和一个(可能为空的)数字序列 (\d*),它们分别是第一和第二捕获组,并且因此可以获得与 a[1]a[2] 的匹配。

这会产生:

>>> print(calculate_atomic_mass('H2-O'))
18.01505
>>> print(calculate_atomic_mass('H2-S-O4'))
97.985321
>>> print(calculate_atomic_mass('C2-H5-O-H'))
46.06635
>>> print(calculate_atomic_mass('H2-N-C6-H4-C-O-2H'))
121.130875
>>> print(calculate_atomic_mass('H2-N15-P3'))
305.037436

因此,我们将第一个捕获组(原子的名称)的 mass[..] 的总和乘以末尾的数字,我们使用 '1' 如果找不到这样的号码。

或者我们可以先拆分数据,然后寻找原子部分和数字部分:

import re
srch = re.compile(r'^([A-Za-z]+)(\d*)$')

def calculate_atomic_mass(molecule):
    """
    Calculate the atomic mass of a given molecule
    """
    result = 0.0
    mol = molecule.split('-')
    if atm in mol:
        c = srch.find(atm)
        result += result[c[1]] * int(c[2] or '1')
    return result

关于python - 如何遍历字典并对其元素进行操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53025584/

相关文章:

python - 导入包时出现意外行为

r - 如何在R中使用map迭代对象以创建一系列gt表

python - 隐式地将类转换为 bool 是惯用的做法吗?

arrays - NumPy 加速设置二维数组的元素

python - 使用星星打印箭头

bash - linux bash 中 python zip() 函数的等价物是什么?

java - Java 初学者(循环)- 缺少 return 语句

python - 使用 gitpython 获取更改的文件

python - 在 Python 中为单个操作设置并行度

python - 在 Altair 中隐藏顶轴