suppl =Chem.SDMolSupplier('D:\HBVdata\HBV_P.sdf') fragments = ['C(=O)', 'C=C', 'C#N'] fingerprints = [Chem.RDKFingerprint(m) for m in suppl if m is not None] counts = [sum([fp.HasSubstructMatch(Chem.MolFromSmarts(fragment)) for fp in fingerprints]) for fragment in fragments]改进这段代码
时间: 2024-02-24 09:58:33 浏览: 97
这段代码的目的是计算一个分子库中每个分子中包含特定结构片段的数量。这里有一些可能的改进点:
1. 使用原生的SMARTS模式而不是字符串来表示结构片段:
```
fragments = [Chem.MolFromSmarts('C(=O)'), Chem.MolFromSmarts('C=C'), Chem.MolFromSmarts('C#N')]
```
这样可以避免一些潜在的语法错误。
2. 在循环中使用enumerate()来获取索引:
```
counts = [sum([fp.HasSubstructMatch(fragment) for fp in fingerprints]) for i, fragment in enumerate(fragments)]
```
这样在使用索引时就不需要再另外定义一个变量了。
3. 对分子库进行空值检查:
```
fingerprints = [Chem.RDKFingerprint(m) for m in suppl if m is not None]
```
这样可以避免在循环中出现空指针异常。
所以改进后的代码应该是这样的:
```
suppl = Chem.SDMolSupplier('D:\HBVdata\HBV_P.sdf')
fragments = [Chem.MolFromSmarts('C(=O)'), Chem.MolFromSmarts('C=C'), Chem.MolFromSmarts('C#N')]
fingerprints = [Chem.RDKFingerprint(m) for m in suppl if m is not None]
counts = [sum([fp.HasSubstructMatch(fragment) for fp in fingerprints]) for i, fragment in enumerate(fragments)]
```
阅读全文