我试图得到一个基于这个过程的输出,最好用一个例子来解释。
例如在微笑中,
C(N)(N)CC(N)C,[0,1,2,0,0,1,0]
这是我试图得到的输出。
它会计算分支(用括号表示)。所以对于上面的例子,它计算第一个(N)为1,则第二个然后,一旦该计数到达未分支的原子,就重置该计数(或括号内)。它继续得到0,计数开始并再次重置。问题是我没有得到预期的输出。下面是我的输出,预期输出和代码。谢谢
另外,我需要确保像这些CC(CC(C))这样的情况没有被错误地索引。它不应该计数多余的,不应该重置,不应该连续计数。那个微笑应该有输出[0 0 1 1 1]。
另一个例子:CC(CCC)CCCC [0 0 1 1 1 0 0 0 0]
对于嵌套的括号,我将重新运行此过程,并从1开始计数。
我来拿这个
SMILES branch_count
0 C(N)(N)CC(N)C [0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0]
1 CCC [0, 0, 0]
2 C1CC1 [0, 0, 0, 0, 0]
3 C1CC1(C)C [0, 0, 0, 0, 0, 0, 1, 0, 0]
4 CC(C)C [0, 0, 0, 1, 0, 0]
但其实应该是这样
x一个一个一个一个x一个一个二个x
2条答案
按热度按时间gwbalxhn1#
这个循环包含了作为字符的方括号,所以对于每个开括号和闭括号,你的代码会把它算作一个原子。你应该使用
.isalpha()
检查字符是否是字母。然后你也应该检查(我的是n
)是否应该用数字来替换字符。例如,在你的坏代码中,括号和数字也被替换为0/1,这意味着你有额外的原子,你不想要的.阅读我的评论额外的解释,并在自己的引擎中运行这段代码,以确保它是正确的(虽然我已经检查了多次).正如你所看到的,我改变了一些东西:
branch_count = [0] * len(smile)
,我将其改为:7eumitmz2#
这就是我的解决方案。
首先,我用
C
替换所有的C1
,以计算一个字母作为一个可选组。然后,我计数开括号。如果只有一个开括号,我就有一个新组。如果我有一个闭括号,我检查下一个字母是开括号,以检查是否有连续的组。如果没有,我将计数器重置为0。这就是结果