我是一名生物学家,我在编程方面颇有新意,但现在我正努力改进;我的背景不是信息学。
我陷入了困境。
我们有关于分子的一些信息;以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
代表整个列表。
答案 0 :(得分:2)
希望我理解你,但你想计算字符串最后一个字符的出现次数吗?
CC -o binary -B direct -z origin -std=c++11 object_files.o -Lblah/lib -R\$ORIGIN/../lib -lotherlib -L/usr/sfw/lib -R/usr/sfw/lib -lcrypto -lsocket
unused $ADDVERS specification from file '/opt/developerstudio12.5/lib/compilers/CC-gcc/gcc_version.map' for object 'libgcc_s.so'
version(s):
GCC_4.2.0
输出:
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))
答案 1 :(得分:1)
欢迎使用Python!
Python有许多有用的模块来处理常见问题。
要解决您的问题,您可以从Counter
collections
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
可以相互添加和减去,这可能对您有用:
>>> mycount = Counter(line.split()[-1] for line in molecule.splitlines())
>>> mycount + mycount
Counter({'C': 4, 'N': 2})
这不仅可以获得不同原子的数量,还可以获得整个分子中出现的数量。
可以通过len
)的Counter
来检索不同原子的数量:
>>> 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
答案 2 :(得分:1)
尽管所有答案在Python方面都是正确的,但我们有来自PDB file:
的行记录格式
COLUMNS DATA TYPE FIELD DEFINITION
-------------------------------------------------------------------------------------
1 - 6 Record name "ATOM "
[...]
77 - 78 LString(2) element Element symbol, right-justified.
[...]
对于存在于大量蛋白质结构中的SE
lenium等元素,需要考虑两个字符[77-78],否则它将变为S
ulfur或E
。
如果您不想自己处理整个解析问题,可以将BioPython's 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})
答案 3 :(得分:0)
由于您的示例中的行长度不同,因此尝试按索引访问数据不是一个好主意,就像您在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
答案 4 :(得分:0)
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)