TypeError: '>=' не поддерживается между экземплярами 'tuple' и 'float'
Я пытаюсь написать небольшой скрипт на Python, который вычисляет индекс сходства Танимото между интересующей молекулой и базой данных молекул. Я использую пибел.
База данных в формате .smi содержит химическую информацию о молекулах в первом столбце и их названия во втором и выглядит следующим образом:
C[C@]12CC[C@H](C1(C)C)CC2=O (-)-CAMPHOR
CC1=CC[C@H](C(=C)C)C[C@@H]1O (-)-CARVEOL
CC1=CC[C@H](CC1=O)C(=C)C (-)-CARVONE
O=CC[C@@H](C)CCC=C(C)C (-)-CITRONELLAL
OCC[C@@H](C)CCC=C(C)C (-)-CITRONELLOL
C[C@@H]1CC[C@@H](C(=C)C)C[C@H]1O (-)-DIHYDROCARVEOL
C[C@@]12CC[C@@H](C1)C(C2=O)(C)C (-)-Fenchone
C[C@@H]1CC[C@H]([C@@H](C1)O)C(C)C (-)-MENTHOL
C[C@@H]1CC[C@H](C(=O)C1)C(C)C (-)-MENTHONE
C[C@@H]1CCCCCCCCCCCCC(=O)C1 (-)-MUSCONE
CC(=C)[C@H]1CCC(=CC1)C=O (-)-PERILLALDEHYDE
.
.
.
Эта версия скрипта работает так, как я ожидаю:
from openbabel import pybel
targetmol = next(pybel.readfile("smi", "/path/to/sample.smi"))
targetfp = targetmol.calcfp() <--- calculate fingerprints of the sample
for mol in pybel.readfile("smi", "/path/to/db.smi"):
fp = mol.calcfp() <--- calculate fingerprints of the db
tan = fp | targetfp <--- calculate the Tanimoto index via the "|" operator
if tan>=0.8:
print(tan)
Выход:
1.0
1.0
0.9285714285714286
0.8571428571428571
1.0
1.0
0.9285714285714286
0.8571428571428571
.
.
.
Понятно, что для того, чтобы придать смысл полученным числам, мне нужно добавить название молекулы к соответствующему индексу Танимото. Я пробовал это:
from openbabel import pybel
targetmol = next(pybel.readfile("smi", "/path/to/sample.smi"))
targetfp = targetmol.calcfp()
for mol in pybel.readfile("smi", "/path/to/db.smi"):
fp = mol.calcfp()
tan = (fp | targetfp, mol.title)
if tan>=0.8:
print(tan, title)
Как из названия, я получаю следующую ошибку:
Traceback (most recent call last):
File "test3.py", line 15, in <module>
if tan>=0.8:
TypeError: '>=' not supported between instances of 'tuple' and 'float'
Я предполагаю, что python, очевидно, не может применитьif tan>=0.8
операции в строковый формат, но я действительно не знаю, как решить эту проблему, так как, как вы можете догадаться, я очень новичок в программировании.
Любые подсказки о том, как исправить этот фрагмент кода, будут оценены. Спасибо за ваше время.
1 ответ
Вам просто нужно изменить его на:tan[0] >= 0.8:
запятая,
(тот, что внутриtan = (fp | targetfp, mol.title)
) — это синтаксис для кортежа, который в основном представляет собой неизменяемый массив, поэтому для доступа к элементам вам нужно делать это по индексу, как для списков.