[英]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
我们应该计算不同原子的数量; 最好说的是,每行的最后一项(例如C
或N
)
我们已经具有驱动我们并提取最后一个项目的功能,但是到现在为止我还是很困惑,因为我们应该编写代码,就像我们不知道我们将找到哪个原子一样(尽管我们知道,因为我们有整个列表,我们有N
, C
, O
和S
)
我们拥有的代码:
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})
这不仅会为您提供不同原子的数量,而且还会为您提供整个分子中外观的数量。 可以通过使用Counter
的len
来检索不同原子的数量:
>>> 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.