Python元素计数中的符号

2024-05-15 21:17:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我是一个生物学家,我在编程方面还是个新手,但现在我正在努力提高;我的背景不是信息学。在

我陷入了一个难题。在

我们有一些关于分子的信息,每一条以原子开头的线代表整个分子中的一个原子。例如,前两行:

ATOM      1  N   ARG A   1       0.609  18.920  11.647  1.00 18.79           N

ATOM      2  CA  ARG A   1       0.149  17.722  10.984  1.00 13.68           C

我们应该计算不同原子的数量;更确切地说,是每行的最后一项(C或{}在示例中)

我们已经有了驱动我们并提取最后一个项目的函数,但我在这一点上很难理解,因为我们应该编写代码,就好像我们还不知道会找到哪个原子一样(尽管我们知道,因为我们有完整的列表,我们有NCO和{})

我们有代码:

^{pr2}$

molecule表示整个列表。在


Tags: 代码信息列表编程arg代表分子ca
3条回答

希望我能理解你的意思,但是你想数一数字符串最后一个字符的出现次数?在

molecule = '''ATOM 1 N ARG A 1 0.609 18.920 11.647 1.00 18.79 N
ATOM 2 CA ARG A 1 0.149 17.722 10.984 1.00 13.68 C
ATOM 2 CA ARG A 1 0.149 17.722 10.984 1.00 13.68 Se
ATOM 2 CA ARG A 1 0.149 17.722 10.984 1.00 13.68 Pu
ATOM 2 CA ARG A 1 0.149 17.722 10.984 1.00 13.68 Pu
ATOM 2 CA ARG A 1 0.149 17.722 10.984 1.00 13.68 C'''

def count_atoms(molecule):
    number_atoms = dict()
    lines = molecule.split(os.linesep)
    for line in lines:
        if line.startswith('ATOM'):
            atom = line.split()[-1].strip()
            if number_atoms.get(atom):
                number_atoms[atom] += 1
            else:
                number_atoms.update({atom: 1})
    return number_atoms

print(count_atoms(molecule))

输出:

^{pr2}$

虽然所有的答案在Python中都是正确的,但是我们有来自PDB file的行:

记录格式

COLUMNS        DATA  TYPE    FIELD        DEFINITION
-------------------------------------------------------------------------------------
 1 -  6        Record name   "ATOM  "
[...]
77 - 78        LString(2)    element      Element symbol, right-justified.
[...]

对于像SElenium这样存在于大量蛋白质结构中的元素,这两个特征都需要考虑到,否则它将变成Sulfur或{}。在

如果您不想自己处理整个解析问题,可以将BioPython's PDB模块与上述任何解决方案结合使用。在

^{pr2}$

Counter({'C': 4570, 'O': 1463, 'N': 1207, 'MN': 4, 'CA': 4})

欢迎来到Python!在

Python有许多处理常见问题的有用模块。在

要解决您的问题,您可以从collections导入Counter

from collections import Counter

>>> molecule = '''ATOM 1 N ARG A 1 0.609 18.920 11.647 1.00 18.79 N
    ATOM 2 CA ARG A 1 0.149 17.722 10.984 1.00 13.68 C
    ATOM 2 CA ARG A 1 0.149 17.722 10.984 1.00 13.68 C'''
>>> Counter(line.split()[-1] for line in molecule.splitlines())
Counter({'C': 2, 'N': 1})

line.split()[-1]获取行的最后一个单词,以防元素具有较长的化学符号,splitlines()将这些行彼此分隔开来。在

Counter可以相互加减,这可能对您有用:

^{pr2}$

这不仅会给你不同原子的数量,也会给你整个分子出现的数量。 不同原子的数量可以通过取lenCounter来检索:

>>> len(Counter(line.split()[-1] for line in molecule.splitlines()))
2

更详细的例子:

molecule = '''ATOM 1 N ARG A 1 0.609 18.920 11.647 1.00 18.79 N
ATOM 2 CA ARG A 1 0.149 17.722 10.984 1.00 13.68 C
ATOM 3 CA ARG A 1 0.149 17.722 10.984 1.00 13.68 Se
ATOM 4 CA ARG A 1 0.149 17.722 10.984 1.00 13.68 Pu
ATOM 5 CA ARG A 1 0.149 17.722 10.984 1.00 13.68 Pu
ATOM 6 CA ARG A 1 0.149 17.722 10.984 1.00 13.68 C'''
>>> Counter(line.split()[-1] for line in molecule.splitlines())
Counter({'C': 2, 'N': 1, 'Pu': 2, 'Se': 1})
>>> len(Counter(line.split()[-1] for line in molecule.splitlines()))
4

相关问题 更多 >