繁体   English   中英

在Python中计数元素符号

[英]Counting element symbols in Python

我是生物学家,并且在编程方面还很陌生,但如今我正在努力提高自己的水平。 我的背景不是信息学。

我完全陷入一个问题。

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

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

我们应该计算不同原子的数量; 最好说的是,每行的最后一项(例如CN

我们已经具有驱动我们并提取最后一个项目的功能,但是到现在为止我还是很困惑,因为我们应该编写代码,就像我们不知道我们将找到哪个原子一样(尽管我们知道,因为我们有整个列表,我们有NCOS

我们拥有的代码:

def count_atom(molecule):

    number_atoms = dict()
    lines = molecule.split(os.linesep)
    for line in lines:
        if line.startswith('ATOM'):
            atom = line[77].strip()
        print atom


    return number_atoms

results= count_atoms(molecule)

molecule代表整个列表。

希望我没问题,但是您想计算字符串中最后一个字符的出现?

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))

输出:

print(count_atoms(molecule))
{'Se': 1, 'Pu': 2, 'N': 1, 'C': 2}

欢迎使用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 s相加或相减,这可能对您有用:

>>> mycount = Counter(line.split()[-1] for line in molecule.splitlines())
>>> mycount + mycount
Counter({'C': 4, 'N': 2})

这不仅会为您提供不同原子的数量,而且还会为您提供整个分子中外观的数量。 可以通过使用Counterlen来检索不同原子的数量:

>>> 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

尽管就Python而言,所有答案都是正确的,但我们有PDB文件中的代码行

记录格式

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

对于具有大量蛋白质结构的SE硒元素,必须同时考虑两个字符[77-78],否则它将成为S硫或E

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

from Bio.PDB import PDBParser
from collections import Counter
parser = PDBParser()
structure = parser.get_structure('PHA-L', '1fat.pdb')

atoms = list()
for model in structure:
    for chain in model:
        for residue in chain:
            for atom in residue:
                atoms.append(atom.element)

print(Counter(atoms))

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

由于示例行的长度不一样,因此尝试按索引访问数据将是一个坏主意,就像您在atom = line[77].strip()

如您所说,区分原子的信息是最后一个字符。 因此,您可以使用列表中的最后一个项目索引符号来仅访问最后一个字符。

>>> data = "ATOM 1 N ARG A 1 0.609 18.920 11.647 1.00 18.79 N"
>>> print(data[-1])
N
lines = ['ATOM 1 N ARG A 1 0.609 18.920 11.647 1.00 18.79 N', 'ATOM 1 N ARG A 1 0.609 18.920 11.647 1.00 18.79 C', 'ATOM 1 N ARG A 1 0.609 18.920 11.647 1.00 18.79 N']

all_elements = {l.split()[-1]  for l in lines}    
counts = {element: 0 for element in all_elements}
for line in lines: 
    counts[line.split()[-1]] += 1
counts
{'C': 1, 'N': 2}

这是计算每个元素的原子数的方法,如果只需要元素数,则可以使用len(counts)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM